題目:讀入自然數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
請按任意鍵繼續. . .