题目描述:
编写程序,接受以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");
}
}
声明:
如果本算法有什么漏洞或者需要改进的地方,希望读者不吝赐教,大家互相学习共同进步,谢谢。