有理数的循环节

有理数的循环节

时间: 1ms        内存:128M

描述:

1/7 = 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。

本题目要求即是:给出一个数字的循环小数表示法。

输入:

用户输入的格式是:
整数,整数

每个整数范围均为:1~1000

输出:

程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。

示例输入:

1,5

示例输出:

0.2

提示:

参考答案(内存最优[1096]):

#include<stdio.h>
int main()
{
    int a,b,i,j,k,l=0;
    int t=0;
    int ss[10000],s[10000];
    scanf("%d%*c%d",&a,&b);

    for(i=0;; i++)
    {
        s[i]=a/b;
        ss[i]=a%b;
        a=10*(a%b);
        for(j=0; j<i; j++)
        {
            if(ss[i]==ss[j])
            {
                t=1;
                break;
            }
        }
        if(t==1)break;
    }

    printf("%d.",s[0]);

    while(s[0]!=0)
    {
        s[0]=s[0]/10;
        l++;
    }
    if(s[1]==0)printf("0");
    else
    {
        for(k=1; k<=j; k++)
        {
            printf("%d",s[k]);
        }
        if(s[i]!=0)
        {
            printf("[");
            for(; k<=i; k++)
            {
                printf("%d",s[k]);
            }
            printf("]");
        }
    }
    return 0;
}

参考答案(时间最优[0]):

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int m,n;
    int a[100]={0};
    int num[100];
    int point=0;
    cin>>m;
    getchar();
    cin>>n;
    bool label=true;
    cout<<m/n;
    m=m%n;
    m*=10;
    if(m==0)
        return 0;
    else
    {
        cout<<".";
    while(label)
    {
        int i;
        bool p=true;//判断是否循环,靠除数和被除数确定
        for(i=0;i<point;i++)
        {
            if(m==a[i])
            {
                p=false;
            }
            if(p==false)
            break;

        }
        if(p)//不循环,加入字符串,记录除数和被除数
        {
            if(m%n==0)
            {
                for(int k=0;k<point;k++)
                    cout<<num[k];
                cout<<m/n<<endl;
                return 0;
            }
            else
            {
                num[point]=m/n;
                a[point]=m;
                point++;
                if(m<n)
                    m*=10;
                else if(m>n)
                {
                    m=m%n;
                    m*=10;
                }
            }
        }
        else//循环,输出字符串
        {
            for(int j=0;j<point;j++)
            {
                if(i==j)
                    cout<<"["<<num[j];
                else cout<<num[j];

            }
            cout<<"]"<<endl;
            label=false;
        }
    }
    }
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注