天天看点

判断分数m/n是有限小数还是循环小数

题目:读入自然数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

请按任意键继续. . .

继续阅读