uva 275 Expanding Fractions

題目:給你一個分數的分子和分母,求出他的循環節。



Sample Input

3 7

345 800

112 990

53 122

0 0

Sample Output

.428571
The last 6 digits repeat forever.
.43125
This expansion terminates.
.113
The last 2 digits repeat forever.
.4344262295081967213114754098360655737704918032786
885245901639
The last 60 digits repeat forever.

#include<cstdio>

#include<cstring>

#include<stack>

#include<iostream>

using namespace std;

#define M 3000

int main()

{

int a,b;

a = b = 0;

while((cin >> a >> b)&& a+b){

printf(".");

int yushu[M] = {0},shang[M] = {0};

///     memset(shang, 0, 30);

a %= b;

a *= 10;

for(int t = 0; t < M; t++) {

shang[t] = a/b;

a = a%b;

yushu[t] = a;

a *= 10;

}

int i ,j;

for(i = 0; i < M; i++){

for(j = i + 1; j < M; j++) {

if(((shang[j] == shang[i]) && (yushu[j] == yushu[i]) )|| (i >= 100)){

goto a1;

}

}

}

a1:

if((shang[j] == 0) && ((j-i)==1)){

for(int m = 0; m < j-1; m++){

if(m % 50 == 49) printf("\n");

printf("%d",shang[m]);

}

printf("\nThis expansion terminates.\n\n");

}

else{

for(int m = 0; m < j; m++){

if(m % 50 == 49) printf("\n");

printf("%d",shang[m]);

}

printf("\n");

printf("The last %d digits repeat forever.\n\n",j-i);

}

}

return 0;

}


1.輸入0 0 停止,以後都可以寫成 -------while((cin >> a >> b)&& a+b)
2. 剛開始總是提示格式錯誤。後來發現。原因在與。每輸入50個字符就要換行。只考慮了第一行。
這裏有一個非常有趣的細節。因爲題目要求了在第一行中。小數點也算一個字符。所以第一行只需要輸出49個。剩下的需要輸出50個字符。那怎麼樣可以統一的概括呢。你可能想到分類討論。但其實 用這個語句  if(m % 50 == 49) printf("\n");  即可。※※前方高能➡️注意把printf("%d",shang[m]);放在這句話後面。那麼第一行。即i=49的那個值還沒有來的及輸出就換行了。但後面都對。如果把這句話放在前面。那沒就是很整齊的每一行都輸出數組中50個元素

發佈了50 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章