习题 3-8 循环小数(Repeating Decimals, ACM/ICPC World Final 1990, UVA 202)

本文详细解析了UVA-202题目的算法实现,通过模拟除法运算,解决给定两个整数a、b求a/b的问题。特别关注小数点后循环与非循环部分的输出,确保输出格式符合特定规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 题目链接:

Repeating Decimals UVA - 202

二.题目大意:

给出两个整数a、b(0 ≤ a ≤ 3000,1 ≤ b ≤ 3000),求 a / b.

表达形式:1. 如果小数点后面  ≤ 50 位,那么输出   整数部分.小数不循环部分(循环小数).        

                  2. 如果小数点后面 >50 位,那么输出   整数部分.小数不循环部分(循环小数...).   

                (小数点后只输出前 50 位) 

三.分析:

模拟除法运算,第一次碰到,详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long int
using namespace std;

const int M = 3010;
int Dec[M];
int Rem[M];

int main()
{
    int a, b;
    while(~scanf("%d %d", &a, &b))
    {
        printf("%d/%d = %d.", a, b, a / b);///整数部分
        int cnt = 0;
        int i;
        while(1)
        {
            a = a % b * 10;
            Rem[cnt] = a;///记录余数
            for(i = 0; i < cnt; ++i)
                if(Rem[i] == a)///余数重复出现
                    break;
            if(i != cnt)
                break;
            Dec[cnt++] = a / b;///记录小数部分
        }
        for(int j = 0; j < i; ++j)
            printf("%d", Dec[j]);///不循环小数部分
        printf("(");
        if(cnt <= 50)
        {
            for(int j = i; j < cnt; ++j)
                printf("%d", Dec[j]);
            printf(")");
        }
        else
        {
            for(int j = i; j < 50; ++j)
                printf("%d", Dec[j]);
            printf("...)");
        }
        printf("\n   %d = number of digits in repeating cycle\n\n", cnt - i);///循环长度
    }
    return 0;
}

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值