分數轉化成小數(2018華科計試第三題)

題目描述:

編寫程序,接受以N/D形式的分數,輸出他們的小數形式,如果小數存在循環節,則用括號括起來,如:1/1.3333333…表示爲0.(3)
例如,輸入:8/5 1/3 11/13
則輸出爲:
8/5=1.6
1/3=.(3)
11/13=.(846153)

思路:

手動模擬除法,將每一位小數和每一次餘數分別存在兩個數組。如果餘數爲0,說明除法結束,無循環;如果餘數中出現相等的情況,說明出現循環節,記錄循環節的位置。

代碼:

#include<stdio.h>
int main()
{
	//n爲被除數,d爲除數 
	int n,d,i,flag=0;
	//a爲正數部分,b爲餘數,c爲每一位小數,k記錄循環節位置 
	int a,b[100],c[100],top,k;
	while((scanf("%d/%d",&n,&d))!=EOF)
	{
		top=flag=0;
		//獲取正數部分、第一次餘數,第一位小數 
		a=n/d;
		b[top]=n%d;
		c[top]=b[top]*10/d;
		//當餘數不爲0 
		while(b[top]!=0)
		{
			top++;
			//計算下一次餘數,下一位小數 
			b[top]=b[top-1]*10%d;
			c[top]=b[top]*10/d;
			//如果餘數出現和第一次的餘數相等,說明出現循環節 
			for(i=0;i<top;i++)
				if(b[i]==b[top])
				{
					flag=1;
					k=i;
					break;
				}
			if(flag)
				break;
		}
		//輸出格式化 
		printf("%d/%d=",n,d);
		if(a!=0)
			printf("%d",a);
		if(top!=0)
			printf(".");
		
		for(i=0;i<top;i++)
		{
			if(flag&&i==k)
				printf("(");
			printf("%d",c[i]);
			if(flag&&(i+1)==top)
				printf(")");
		}
				
		printf("\n");
	}	
} 

聲明:

如果本算法有什麼漏洞或者需要改進的地方,希望讀者不吝賜教,大家互相學習共同進步,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章