题目:
输入两个整数,判断这两个数相处的结果是不是循环小数,若是请输出循环节。
Code(C):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int gcd(int m,int n)
{
int temp;
while(n)
{
temp = m%n;
m = n;
n = temp;
}
return m;
}
int isprime(int n)
{
int i;
for(i = 2;i <= (int)sqrt(n);i++)
if(n%i == 0)
return 0;
return 1;
}
int primefactor(int n)
{
int i,flag = 0;
if(isprime(n))
{
if(n != 2 && n != 5)
return 1;
}
else
{
for(i = 2;i <= (int)sqrt(n);i++)
{
if(n%i == 0)
{
if(i != 2 && i != 5)
return 1;
return primefactor(n/i);
break;
}
}
}
return 0;
}
int mexcircle(int n)
{
if(n%2== 0 || n%5 == 0)
{
return primefactor(n);
}
return 0;
}
char * judgecircle(int m,int n)
{
char *p;
int g,r,s,t,k = 0,flag;
if(n == 0)
{
printf("分母输入不合法\n");
exit(0);
}
if(m < 0)
m = abs(m);
if(n < 0)
n = abs(n);
if(m > n)
m = m%n;
g = gcd(m,n);
if(g > 1)
{
m /= g;
n /= g;
}
flag = mexcircle(n);
if(flag == 1)
{
t = m;
while(flag)
{
r = t;
s = r*10/n;
t = r*10%n;
m = t;
g = gcd(m,n);
if(g > 1)
{
m /= g;
n /= g;
}
flag = mexcircle(n);
}
}
t = m;
p = (char *)malloc(n+1);
while(1)
{
r = t;
s = r*10/n;
t = r*10%n;
if(t == 0)
{
k = 0;
break;
}
p[k++] = s+'0';
if(t == m)
break;
}
p[k] = '\0';
return p;
}
void main()
{
char *p;
int m,n;
printf("输入两个整数\n");
scanf("%d%d",&m,&n);
p = judgecircle(m,n);
if(strlen(p) == 0)
printf("两个整数相除是有限小数\n");
else
printf("循环节为%s\n",p);
}