UVA - 202. Repeating Decimals题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/82186971

UVA - 202. Repeating Decimals题解

欢迎访问我的Uva题解目录https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

UVA - 202. Repeating Decimals题目描述

题意解析

输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。

算法设计

本题其实是模拟长除法的计算过程,其中每一次除法时都会产生商和余数,余数作为下一次除法的被除数,当余数和以前出现过的被除数出现重复时即开始出现循环。定义一个vector<pair<int,int>>类型的变量v,下标表示小数的位置,pair中的first变量记录被除数,second变量记录商,余数作为下一次除法的被除数,循环进行除法,直到余数在v中记录的first变量中已经出现过时,则出现了循环节。

注意点

当循环节超过50位时,50位以后的数字不再输出,而用…代替。此外,包括最后一组数据在内,每组输出最后都需要有一个空行,即需要两个换行符。

C++代码

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<(b);++i)//for循环的一种简单写法的宏定义
using namespace std;
int main(){
    int n,d;
    while(~scanf("%d%d",&n,&d)){
        printf("%d/%d = %d.",n,d,n/d);
        n=n%d*10;//余数作为下一次的被除数
        vector<pair<int,int>>v;
        auto start=INT_MAX;//存储循环最前的小数所在位置
        while(start==INT_MAX){
            v.push_back({n,n/d});
            n=n%d*10;//余数作为下一次的被除数
            _for(i,0,v.size())//查看现在的余数是否在被除数出现过
                if(v[i].first==n){
                    start=i;
                    break;
                }
        }
        _for(i,0,start)
            printf("%d",v[i].second);
        printf("(");
        _for(i,start,min((int)v.size(),start+50))
            printf("%d",v[i].second);
        printf("%s)\n",v.size()>start+50?"...":"");
        printf("   %d = number of digits in repeating cycle\n\n",v.size()-start);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/82186971