分数化小数
题目描述
写一个程序,输入一个形如N/D的分数(N是分子,是分母),输出它的小数形式。
如果小数有循环节的话,把循环节放在一对圆括号中。例如,
1/3 = .33333333 写成0.(3)
41/333 = 0.123123123… 写成0.(123)
用xxx.0 成表示整数
典型的转化例子:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
输入
单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。
输出
小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。
样例输入
45 56
样例输出
0.803(571428)
#include<stdio.h>
#include<math.h>
int a[100000],b[100000];
int main()
{
int x,y,i,j,k,m,n,f=0,p,q,l;
scanf("%d%d",&m,&n);
p=m/n;//计算小数点前面的
q=m%n;//留着计算小数点后面的数
a[0]=x;
printf("%d.",p);//输出小数点前面的数
//计算字符个数
if(p==0)
l=1;
else
l=log10(p)+1;
l=l+1;//别忘了小数点
i=1;
b[0]=q;
while(f==0)
{
a[i]=q*10/n;
q=q*10;
q=q%n;
b[i]=q;
if(q==0)//计算的余数等于0,结束运算,标记是否有循环节。
{
f=1;break;
}
else
{
for(j=0;j<i;j++)
{
if(b[i]==b[j])//出现循环节
{
f=2;
x=j,y=i;//标记循环节开始和结束的地方
break;
}
}
}
i++;
}
int xx=100,yy=100;
if(f==1)//没有循环节的输出,注意76个字符换行
{
for(k=1;k<=i;k++)
{
if(yy==0&&(k-xx)%76==0)//没过一个76进行一次换行
printf("\n");
if(k==76-l)
{
printf("\n");xx=k,yy=0;
}
printf("%d",a[k]);
}
}
if(f==2)//如果有循环节
{
for(i=1;;i++)
{
//切记有循环节的小数也有可能循环节会大于76个字符
if(yy==0&&(i-xx)%76==0)
printf("\n");
if(i==76-l)
{
printf("\n");
xx=i,yy=0;
}
if(i==x+1)//循环节的左括号
printf("(");
printf("%d",a[i]);
if(i==y)//循环节的右括号
{
printf(")");break;//输出右括号直接break结束循环。
}
}
}
printf("\n");
return 0;
}