奇特的气温计算

题目介绍

有一个奇怪的国家,这个国家的气温计算方式比较奇特。

这个国家的可以预测明天的气温:预测方式为,对于某天的气温 \(n\)\(n\) 是一个给定的十进制正整数,那么下一天的气温将会是:用 \(2 ~ n-1\) 进制表示 \(n\) 时,每一个进制下所有位上的数字的和的平均数。

代码 & 题目思路

首先,我们读取输入的正整数 \(n\),表示给定的气温。
然后,我们定义一个变量 \(sum\) 来表示总和,初始化为 \(0\)
接下来,我们使用一个循环从 \(2\)\(n-1\),遍历每个进制。
在每个进制下,我们将 \(n\) 转换为该进制,并计算各位数字之和。我们使用一个临时变量 \(temp\) 来表示当前的 \(n\),然后不断取 \(temp\) 除以当前进制的余数,同时将余数累加到 \(digit_sum\) 中,最后将 \(temp\) 除以当前进制来更新 \(temp\) 的值。
我们将每个进制下的各位数字之和 \(digit_sum\) 累加到总和 \(sum\) 中。
接着,我们定义两个变量 \(num1\)\(den\),分别表示最简分数的分子和分母,初始值分别为 \(sum\)\(n-2\)
我们使用辗转相除法求最大公约数,将最大公约数应用于分子和分母的约分。
最后,我们输出最简分数的分子和分母。

代码实现

#include <iostream>

using namespace std;

// 辗转相除法求最大公约数
int gcd(int a, int b) {
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

int main() {
    int n;
    cin >> n;

    int sum = 0;
    // 从2到n-1遍历每个进制
    for (int base = 2; base <= n - 1; base++) {
        int temp = n;
        int digit_sum = 0;
        // 将n转换为当前进制,计算各位数字之和
        while (temp > 0) {
            digit_sum += temp % base;
            temp /= base;
        }
        sum += digit_sum;
    }

    int num1 = sum;
    int den = n - 2;
    // 约分,求最大公约数
    int com = gcd(num1, den);
    num1 /= com;
    den /= com;

    cout << num1 << "/" << den << endl;

    return 0;
}
posted @ 2023-11-25 08:33  卡布叻-空白  阅读(27)  评论(0)    收藏  举报