1. 程式人生 > >【迴圈小數】輸出1/n. (是迴圈小數的,只輸出第一個迴圈節).

【迴圈小數】輸出1/n. (是迴圈小數的,只輸出第一個迴圈節).

利用餘數和商解題

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
int main(void){
    int n,k,digit[100010],vis[100010];
    while(cin>>n)){
        if(n==1){
            printf("1\n");  //為1的時候 即 1/1=1;
        }
        else if(n==-1){
            printf("-1\n");  //為-1的時候 即 1/-1=-1;
        }
        else{
            if(n<0){
                cout<<"-";  
                n=-n;    //轉換為正數
            }
            memset(vis,0,sizeof(vis));
            k=1; //即 1%n=1; 
            
            /*k代表餘數*/
            
            int cnt=0;  //記錄陣列的下標
            vis[k]=true;  //判斷餘數是否已經出現過
            
            /*若餘數出現過 則說明已經出現了迴圈節*/
            
            cout<<"0.";
            while(k){
                k*=10;  //相當於每次在餘數後添加個0
                digit[cnt++]=k/n;  //用資料記錄商
                k%=n; //求每次運算的的餘數
                if(vis[k]==true)break; //找到迴圈節
                vis[k]=true;
            }
            for(int i=0;i<cnt;i++){
                cout<<digit[i];
            }
            cout<<endl;
        }
    }
    return 0;
}

拓展: 輸出m/n.(是迴圈小數的,只輸出第一個迴圈節).

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
int main(void){
    int m,n,k,digit[100010],vis[100010];
    while(cin>>m>>n){
            if(m<0&&n>0){
                cout<<"-";
                m=-m;
            }
            else if(m>0&&n<0){
                cout<<"-";
                n=-n;
            }
            memset(vis,0,sizeof(vis));
            k=m%n;
            int cnt=0;
            vis[k]=true;
            if(m%n==0){
                cout<<m/n;
            }
            else{
                cout<<m/n<<".";
            }
            while(k){
                k*=10;
                digit[cnt++]=k/n;
                k%=n;
                if(vis[k]==true)break;
                vis[k]=true;
            }
            for(int i=0;i<cnt;i++){
                cout<<digit[i];
            }
            cout<<endl;
    }
    return 0;
}