• 分数变小数 (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
  • 相关阅读:
    《编写可维护的JavaScript》读书笔记
    第十四天:还是看代码
    第十三天:过了一遍rt_thread,看代码架构
    第十二天:rt_thread系统
    第十一天:要做stm32了
    第十天:没太专注工作
    第九天:rtc问题查找与测试
    第八天:android编译环境搭建
    第七天:终于看到板子了
    第六天和周末:感慨下这周
  • 原文地址:https://www.cnblogs.com/xiaolaji/p/10998351.html
Copyright © 2020-2023  润新知