天天看點

判斷分數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

請按任意鍵繼續. . .

繼續閱讀