蓝桥杯备赛——有理数的循环节

248 阅读1分钟

题目描述

1/7 = 0.142857142 ⋯ 是个无限循环小数。

任何有理数都可以表示为无限循环小数的形式。

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

输入描述

输入一行,两个整数。

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

输出描述

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

输入输出样例

示例

输入

1,7

输出

0.[142857]

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

分析

拿res来存储小数位,digit来存储余数的位置,在while循环中首选获取余数t记录余数的位置digit[t],j为当前的小数位数。

代码

#include<iostream>
#include<cstdio> 
using namespace std;
int digit[1005];
char res[1005];
int main()
{
    int a, b;
    scanf("%d, %d", &a, &b);
    double m = (double)a / b;
    int j = 1, t;
    while(1)
    {
        t = a - a / b * b;
        a = t * 10;
        res[j] = a / b + '0';
        if (digit[t] != 0) break;
        digit[t] = j++;
    }
    if (t == 0)
    {
        cout << m << endl;
        return 0;
    }
    cout << (int)m << ".";
    for (int k = 1; k < j; ++k)
    {
        if (k == digit[t])
        cout << "[";
        cout << res[k];
    }
    cout << "]" << endl;
  
    return 0;
}