分数变小数 (2007年青岛市程序设计竞赛试题(小学组))

写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环节,要将其用括号括起来。例如:1/3=.33333…表示为.(3),又如41/333=.123123… 表示为.(123)。

一些转化的例子:

1/3=.(3)

22/5=4.4

1/7=.(142857)

3/8=.375

45/56=0.803(571428)

输入(a5.in):一行,两个数n、d,中间用空格隔开,0<N<65535,0<D<65535。

输出(a5.out):一行,设运算结果小数点后最多保留100位。

样例:

输入:1 7

输出:1/7=.(142857)

没什么太简单的思路,就是模拟一下就好了,如果现在的余数在之前出现过,说明出现了循环节这时break 就好了,

我看网上其他代码大多数碰到121/12时都会出现错误(正确答案是10.08(3))

就写了这篇博客

#include<bits/stdc++.h>
using namespace std;
#define Max 100
int Left[Max];
int Digit[Max];
int n,d,q,Top;
void Cacl(void)
{
    int i=0,j=1;
    Digit[0]=n/d;
    Left[0]=n%d;
    Top=0,q=0;
    while(Left[Top]!=0&&j==1&&Top<100)
    {
        Top++;
        Digit[Top]=(Left[Top-1]*10)/d;
        Left[Top]=(int)(Left[Top-1]*10)%d;
        for(i=0; i<=Top-1; i++)
        {
            if(Left[Top]==Left[i])
            {
                q=i+1;
                j=0;
                break;
            }
        }
    }
}
void print(void)
{
    int i;
    printf("%d/%d=",n,d);
    if(Digit[0]!=0)
    {
        printf("%d",Digit[0]);
    }
    if(Top>0)
    {
        printf(".");
    }
    for(i=1; i<=Top; i++)
    {
        if(i==q)
        {
            printf("(");
        }
        printf("%d",Digit[i]);
    }
    if(q>0)
    {
        printf(")");
    }
}
int main(void)
{
    scanf("%d%d",&n,&d);
    Cacl();
    print();
    return 0;
}
View Code

 

posted @ 2019-06-10 16:16  勿忘安己  阅读(385)  评论(0编辑  收藏  举报