1. 程式人生 > >【高精度】高精度分數[c++]

【高精度】高精度分數[c++]

                                                       【高精度】高精度分數                                                  

時間限制: 1 Sec 記憶體限制: 64 MB

題目描述
“人無遠慮,必有近憂”是修羅王一直以來恪守的信條,為了以防萬一,他在很久以前就將《魔法寶典》的全部資訊編碼為一個巨大無比的自然數,並在這個數前加一個0和小數點,使它變成一個分數。然後他在戒指上刻了一個記號,使記號的兩端長度比等於這個分數。這樣,雖然他在入獄時手上只帶了一個戒指,但只要測量出戒指上記號的比值M/N,他就可以還原《魔法寶典》的全部資訊。
現在的問題是:已知分數M/N,試計算M/N的值。如果M/N是無限迴圈小數,則計算並輸出它的第一迴圈節,同時要求輸出迴圈節的起止位置(小數位的序號)。

輸入
只有一行,即M/N,其中0 < M < N < 100。

輸出
輸出M/N的值,如為無限迴圈小數,則輸出第一迴圈節及起止位置。

樣例輸入
17/97

樣例輸出
17/97=0.175257731958762886597938144329896907216494845360824742268041237113402061855670103092783505154639
from 1 to 96

提示
【輸入樣例2】
1/2

【輸出樣例2】
1/2=0.5

可以將商存放在一維陣列中,進行除法運算,模擬人的手工操作,即每次求出商的一位後,將餘數乘以10,再計算商的下一位。若某次餘數為0,則為有限不迴圈小數。若某次計算後的餘數與前面某個餘數相同時,則M / N是無限迴圈小數。

程式碼[c++]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 105;

int main()
{
    int m,n;
    while(scanf("%d/%d",&m,&n)!=EOF)
    {
        int modnum[100] = {0};//記錄每個餘數出現的次數(餘數的範圍0~98)
        printf("%d/%d=0."
,m,n); int div[maxn] = {0}; int k=-1; int judge=1; modnum[m]=1;//將被除數也算作餘數 for(int i=1; i<105&&k==-1; i++) { m*=10; div[i]=m/n; m=m%n; if(modnum[m])//若某次計算後的餘數與前面某個餘數相同時,則M/N是無限迴圈小數 { k=i+1; judge=0; break; } modnum[m]=i+1; if(modnum[0])//若某次餘數為0,則為有限不迴圈小數 { k=i+1; break; } } for(int i=1; i<k; i++) printf("%d",div[i]); printf("\n"); if(!judge)//輸出迴圈節 printf("from %d to %d\n",modnum[m],k-1); } return 0; }