循環小數 UVa202


輸入整數a和b(0<=a<=3000,1<=b<=3000),輸出a/b的循環小數表示以及循環節長度。

例如,a=5,b=43,小數表示為0.(116279069767441860465),循環字節長度為21

 

這個題,忘了怎樣使a/b的結果保留多位小數!!!

具體方法為計算得出其多位小數(位數要足夠大),再判斷其周期,周期不會超過分母就在小於范圍內的周期一個一個判斷即可。

注意,該題循環不一定是從小數點后一位數開始,可能從之后才開始循環

 

應該想到豎式,那就是求小數點后n位的方法!  a/b求出整數位,接着(a%b)*10/b即為小數點后一位,下一位a=a%b繼續上一步驟可得

寫吐了

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int p[3000];
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)==2&&b){
        int t=a%b,k=0,c,x;
        x=floor((double)a/b);
        printf("%d/%d=%d.",a,b,x);
        memset(p,0,sizeof(p));
        for(int i=0;i<3000;i++){       //計算小數點后3000位小數
            t*=10;
            p[i]=t/b;
            t%=b;
        }
        while(1){             //循環是從第k位開始
            bool flag;
            for (c=1;c<=b;c++){     //周期c是大於0且小於等於b的人一個數
                flag=true;
                for (int j= 0;j<3000-k;j++)
                    if(p[j+k]!=p[j%c+k]){     //j%c+k為第一個周期
                        flag=false;
                        break;
                    }
                if(flag)break;
                    //cout<<c<<" *"<<k<<endl;
            }
            if(flag){
                for(int j=0;j<k;j++)printf("%d",p[j]);
                printf("(");
                if (c<= 50)for(int j=k;j<c+k;j++)printf("%d",p[j]);
                else{
                for(int j=k;j<k+50;j++)printf("%d",p[j]);
                printf("...");
                }
                printf(")\n");
                printf("   %d = number of digits in repeating cycle\n\n",c);
                break;
            }
            k++;
        }
    }
    //system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM