题目介绍
有一个奇怪的国家,这个国家的气温计算方式比较奇特。
这个国家的可以预测明天的气温:预测方式为,对于某天的气温 \(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;
}
标签:digit,进制,temp,int,sum,奇特,计算,气温
From: https://www.cnblogs.com/Cherry929/p/17855170.html