题目:读入自然数m和n(0<=m<n<=1000),判断分数m/n是有限小数还是循环小数
解题思想: 循环小数必定会出现余数相同的情况,有限小数不可能出现余数相同的情况
//0<=m<n<=1000,m/n
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
void array_n(int m, int n )
{
int b[1000]={0}, b1[1000]={0};
int i=1, r, k;
r=m%n;
b[r]=b[r]+1;
printf("b[%d]=%d \n",r, b[r]);
int cc=1;
b1[cc-1]=r;
//求余数,余数为零,m/n是有限小数,停止; 余数不为零且第二次出现,说明是循环小数,循环节从该余数处开始。
while (r!=0) //若r=0,说明m/n是有限小数
{
m=r*10;
r=m%n;
b[r]=b[r]+1;
cc=cc+1; //cc用于记录余数为零或者余数第二次出现时,while循环执行的次数
b1[cc-1]=r;
printf("b[%d]=%d \n",r, b[r]);
if(b[r]==2) //若r!=0,且余数重复出现,说明m/n是循环小数,且循环节为该数第一次出现到该数第二次出现间的所有数,
break;
}
printf("cc=%d r=%d\n",cc, r);
if (r==0)
{
printf("m/n 是有限小数: 0.");
for (k=0; k<cc-1; k++)
printf("%d", b1[k]*10/n);
printf("\n");
}
else
{
printf("m/n 是循环小数: 0.");
for (k=0; k<cc-1; k++)
{
if(b1[k]==r)
printf("(");
printf("%d", b1[k]*10/n);
}
printf(")\n");
}
}
int main()
{
//int m=1, n=893;
int m=1, n=6, a=1, b=8;
array_n(m, n);
array_n(a, b);
system("pause");
return 0;
}
运行结果:
b[1]=1
b[4]=1
b[4]=2
cc=3 r=4
m/n 是循环小数: 0.1(6)
b[1]=1
b[2]=1
b[4]=1
b[0]=1
cc=4 r=0
m/n 是有限小数: 0.125
请按任意键继续. . .