欧拉计划 26

2021-07-28  本文已影响0人  Plutorres

Reciprocal cycles

题目描述

单位分数指分子为 1 的分数
例如 \frac{1}{7} = 0.(142857)
这里括号表示循环节,\frac{1}{7} 的循环节为 142857,长度为 6

在所有满足 d < 1000 的数中,求使得其倒数 \frac{1}{d} 的十进制表示中循环节最长的 d

思路

直接竖式除法模拟即可

代码

// 倒数的循环节
#include <cstdio>
#include <cstring>

int pos[1005];
int ans;

// 模拟竖式除法,获取循环节的长度
int getLen(int x) {
    memset(pos, 0, sizeof(pos));
    int r = 1, t = 0;  // r 为余数,t为小数点后的数位
    while (r) {
        t += 1;
        r = (r * 10) % x; // 这两步可理解为在余数后添一个 0 试除
        if (pos[r]) return t - pos[r]; // 余数 r 之前出现过,则说明进入循环
        pos[r] = t;
    }
    return 0;
}

int main() {
    for (int i = 2; i < 1000; i++) {
        int len = getLen(i);
        if (len > ans) ans = len;
    }
    printf("%d\n", ans);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读