2018华科计算机笔试第三题--分母转化成小数

版权声明:本文为博主原创文章,未经博主允许不得转载。可联系邮箱[email protected] https://blog.csdn.net/Justin_bibo/article/details/79605732

分母转化成小数


题目

编写程序,接受以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 xunhuan(int *a,int *b)
{
    int i;
    for(i=2;i<200;i++)
    {
        if(a[i]==-1)
        return -1;
        if(a[1]==a[i])
            if(b[1]==b[i])/*商和余数相同,表示循环*/
        {
            return i;
        }
    }
}
int main()
{
    int n,i,xunhuanjie;/*循环节*/
    xunhuanjie=-1;
    int d;
    int a[200];/*存放每一位的商*/
    int b[200];/*存放每一位的余数*/
    for(i=0;i<200;i++)
    {
        a[i]=-1;
        b[i]=-1;
    }
    scanf("%d/%d",&n,&d);
    i=0;

    while(1)/*迭代算商和余数*/
    {
        a[i]=n/d;
        b[i]=n%d;
        if(b[i]==0)
            break;
        xunhuanjie=xunhuan(a,b);
        if(xunhuanjie!=-1)
            break;
        n=b[i]*10;
        i++;
    }
    if(b[0]==0)
        printf("%d\n",a[0]);/*是个整数,输出整数部分*/
    else{
            if(a[0]==0)
                i=1;
            else
                i=0;

            for(;i<200;i++)
            {
                if(a[i]==-1)
                    break;
                if(i==1)/*如果有小数部分输出小数点*/
                    {
                        printf(".");
                        if(xunhuanjie!=-1)/*如果有循环输出(*/
                        printf("(");
                    }
                printf("%d",a[i]);
            }
             if(xunhuanjie!=-1)
                printf(")");
             printf("\n");
        }

}

作者简介:

鉏飞祥,就读于安徽大学。邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/Justin_bibo/article/details/79605732