33,027
社区成员




#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int x,y;
cin>>x>>y;
if(! y){
cout<<"数据错误"<<endl;
return 0;
}
x %= y;//仅取小数部分
int t;
t = y;
for(;! (t%2);)
t /= 2;
for(;! (t%5);)
t /= 5;
if((t == 1) || (x == 0)){
cout<<"不是循环小数"<<endl;
system("pause");
return 0;
}
if( x < 0)
x = -x;
if(y < 0)
y = -y;
//不考虑负数
for(int a = x,b = y,k;;){
k = b % a;
if(! k){
x /= a;
y /= a;
k = a;
break;
}
a = k;
b = a;
}
//约分,感觉多余
cout<<"x/y"<<endl;
cout<<x<<"/"<<y<<endl;
map<int ,int > m;
vector<int> remaind;
for(int n = 0;;++ n){
if(m.find(x) == m.end()){
remaind.push_back( (10*x) / y);
m[x] = n;
x = (10*x) % y;
}else{
cout<<"循环节:";
for(vector<int>::iterator p = remaind.begin()+m[x];p != remaind.end();++p)
cout<<*p;
cout<<endl;
break;
}
}
system("pause");
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned int index;
void set_q(unsigned int q,unsigned char buf[])
{
if(q<10)
{
buf[index]='0'+q;
index++;
return;
}
else
{
set_q(q/10,buf);
set_q(q%10,buf);
return;
}
}
unsigned int Get_xhj(unsigned int m,unsigned int n,unsigned char Xhj[])
{
unsigned int *flag=(unsigned int*)malloc(n*sizeof(unsigned int));
memset(flag,0,n*sizeof(unsigned int));
index++;
unsigned int r,q;
q=m/n;
set_q(q,Xhj);
r=m-q*n;//余数,新的分母
while((r!=0)&&(flag[r]==0))//r==0,则整除,flag[r]!=0,则循环节已经出现
{
flag[r]=index;
q=(r*10)/n;
r=r*10-q*n;
set_q(q,Xhj);
}
Xhj[0]=flag[r];
free(flag);
return r;
}
int main()
{
index=0;
unsigned int i;
unsigned char data[20];
int m,n,r;
printf("Please input m and n,keep m is larger than n:\n");
scanf("%d %d",&m,&n);
r=Get_xhj(m,n,data);
if(r==0)
{
printf("m 可被n除尽\n");
return 0;
}
printf("循环节为:");
for(i=data[0];i<index;i++)printf("%c ",data[i]);
printf("\n%循环节长度:%d\n",index-data[0]);
return 0;
}
最平凡的(最慢的)实现:
#include <stdio.h>
typedef unsigned long ul;
#ifdef _MSC_VER
typedef __int64 int64;
#else
typedef long long int64;
#endif
int64 gcd( int64 a , int64 b )
{
while( a %= b )
if( 0 == (b %= a) )
return a;
return b;
}
void slove( int64 a , int64 b )
{
int c;
int64 x;
x = gcd( a , b ); a /= x; b /= x;
while(0==b%5) b/=5,a*=2;
while(0==b%2) b/=2,a*=5;
a %= b;
if(1!=b)
{
x = a;
do{
a *= 10;
c = (int)(a/b);
a %= b;
putchar( '0'+c );
} while(a!=x);
}
putchar('\n');
}
int main()
{
ul a , b ;
while( 2 == scanf( "%lu%lu" , &a , &b ) && 0 != b )
slove( a , b );
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned int index;
void set_q(unsigned int q,unsigned char buf[])//存储商到buf中
{
if(q<10)
{
buf[index]='0'+q;
index++;
return;
}
else
{
set_q(q/10,buf);
set_q(q%10,buf);
return;
}
}
int Get_xhj(unsigned int m,unsigned int n,unsigned char Xhj[])//计算循环节
{
unsigned int *flag=(unsigned int*)malloc(n*sizeof(unsigned int));
if(NULL==flag)
{
printf("Memory Error!\n");
return -1;
}
memset(flag,0,n*sizeof(unsigned int));
index++;
unsigned int r,q;
q=m/n;
set_q(q,Xhj);
r=m-q*n;//余数,同时作为新的分母
while((r!=0)&&(flag[r]==0))//r==0,则整除,flag[r]!=0,则循环节已经出现
{
flag[r]=index;//记录循环节起始位置
q=(r*10)/n;
r=r*10-q*n;
set_q(q,Xhj);
}
Xhj[0]=flag[r];
free(flag);
return r;
}
int main()
{
index=0;
unsigned int i;
unsigned char *data;
int m,n,r;
printf("Please input m and n:\n");
scanf("%d %d",&m,&n);
data=(unsigned char*)malloc(n*sizeof(unsigned char));
if(NULL==data)
{
printf("memory error\n");
return 0;
}
while(m<n)
{
m*=10;
}
r=Get_xhj(m,n,data);
if(r==0)
{
printf("m 可被n除尽\n");
return 0;
}
else if(r==-1)
{
printf("memory error\n");
return 0;
}
printf("循环节为:\n");
for(i=data[0];i<index;i++)printf("%c ",data[i]);
printf("\n%循环节长度:%d\n",index-data[0]);
return 0;
}