分数化小数(模拟除法)

分数化小数

题目描述
写一个程序,输入一个形如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;
}

猜你喜欢

转载自blog.csdn.net/m0_46381590/article/details/111418403