uva202repeating decimals模拟

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93800#problem/H

题意:输入整数a和b(0<=a,b<=3000),输出a/b的小数表示以及循环节长度。

思路:分数不能表示无限不循环小数。建立3个数组,一个放商,一个放余数,一个对应下角标的数若是余数则元素为1,即记录余数存在。循环除数加一次,若余数为0,则循环节长度为1,若当前得到的余数已经存在,则有循环节,求出2个相同余数的距离即为循环节长度。

#include<iostream>
#include<string.h>
using namespace std;
#define maxn 4000

int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        int m[maxn],n[maxn],o[maxn];
        memset(o,0,sizeof(o));
        m[0]=a/b;
        n[0]=a%b;
        if(n[0]==0)
        {
            cout<<a<<"/"<<b<<" = "<<m[0]<<".(0)"<<endl<<"   1 = number of digits in repeating cycle"<<endl<<endl;
            continue;
        }
        o[n[0]]=1;
        int flag=0,ch,i;
        for(i=1;i<maxn;i++)
        {
            m[i]=n[i-1]*10/b;
            n[i]=n[i-1]*10%b;
            if(n[i]==0)
            {
                flag=1;
                break;
            }
            if(o[n[i]]==1)
            {
                for(int j=i-1;j>=0;j--)
                {
                    if(n[j]==n[i])
                    {
                        ch=j;
                        break;
                    }
                }
                break;
            }
            o[n[i]]=1;
        }
        cout<<a<<"/"<<b<<" = "<<m[0]<<".";
        if(flag)
        {
            for(int u=1;u<=i;u++)
            {
                if(u==51)
                {
                    cout<<"..."<<endl;
                    break;
                }
                cout<<m[u];
            }
            if(i<50)cout<<"(0)"<<endl;
            cout<<"   1 = number of digits in repeating cycle"<<endl<<endl;
        }
        else
        {
            if(ch<50)
            {
                for(int u=1;u<=i;u++)
                {
                    if(u==ch+1)
                    {
                        cout<<"(";
                    }
                    if(u==51)
                    {
                        cout<<"...";
                        break;
                    }
                    cout<<m[u];
                }
                cout<<")"<<endl;
            }
            else
            {
                for(int u=1;u<=50;u++)
                {
                    cout<<m[u];
                }
                cout<<"..."<<endl;
            }
            cout<<"   "<<i-ch<<" = number of digits in repeating cycle"<<endl<<endl;
        }
    }
    return 0;
}

一开始错因为能除开时省略号后还加(0)。

最后总是不过,还一直找题解,看不下去,最后突然输了1和1,发现输出1.0(0)。花了这么长时间,真是哭死了。。。

 

posted @ 2016-05-07 10:51  哲贤  阅读(724)  评论(0编辑  收藏  举报