題目描述:
編寫程序,接受以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");
}
}
聲明:
如果本算法有什麼漏洞或者需要改進的地方,希望讀者不吝賜教,大家互相學習共同進步,謝謝。