1. 程式人生 > >《演算法競賽入門經典》 習題3-8 迴圈小數

《演算法競賽入門經典》 習題3-8 迴圈小數

《演算法競賽入門經典》 習題3-8 迴圈小數

輸入整數a和b(0<=a<=3000,1<=b<=3000),輸出a/b的迴圈小數表示以及迴圈節長度。例如a=5,b=43,小數表示為0.(116279069767441860465),迴圈節長度為21.

#include<stdio.h>
#include<memory.h>
int main()
{
	int a,b;
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		int count=0;
		int c=a; 
		int ans[3010],repet[3010],s[3010]; 	
		memset(ans,0,sizeof(ans));
		memset(repet,0,sizeof(repet));
		ans[count++]=a/b; //記錄整數部分
		a=a%b; //取餘數
		while(!repet[a]&&a) /*當出現相同數時,迴圈節結束,跳出迴圈,或餘數為0時,跳出*/
		{
			repet[a]=count;
			s[count]=a; 
			ans[count++]=10*a/b; //記錄小數 
			a=10*a%b;
		} 
		printf("%d/%d=%d.",c,b,ans[0]);
		for(int i=1;i<count&&i<=50;i++)
		{
			if(a==s[i]&&a) printf("(");  // a不等於0,說明有迴圈節 
			printf("%d",ans[i]);
		}
		if(!a) printf("(0"); //如果沒有迴圈節,迴圈為0 
		if(count>50) printf("...");
		printf(")\n");
		printf("   %d = number of digits in repeating cycle\n\n",!a?1:count-repet[a]);
	}
	return 0;
 } 

怎麼寫小數呢,可以算幾個數試試,就比如5/2,先取整數2,取餘1,1*10/2,取到第一個小數5,怎麼算迴圈呢,當後面的小數與第一個小數重複時,就說明迴圈到了。
(イヤリングが欲しい)