洛谷 B3841 [GESP202306 二级] 自幂数判断
原题链接
https://www.luogu.com.cn/problem/B3841
B3841 [GESP202306 二级] 自幂数判断
题目描述
自幂数是指,一个 N 位数,满足各位数字 N 次方之和是本身。例如,153是 3 位数,其每位数的 3 次方之和,1^3+5^3+3^3=153,因此 153是自幂数;1634是 4 位数,其每位数的 4次方之和,1^4+6^4+3^4+4^4=1634,因此 1634 是自幂数。现在,输入若干个正整数,请判断它们是否是自幂数。
输入格式
输入第一行是一个正整数 M,表示有 M个待判断的正整数。约定 1 <=M <= 100。
从第 2 行开始M行,每行一个待判断的正整数。约定这些正整数均小于 10^8。
输出格式
输出 M 行,如果对应的待判断正整数为自幂数,则输出英文大写字母 T,否则输出英文大写字母 F。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
输入输出样例
输入 #1
3 152 111 153
输出 #1
F F T
输入 #2
5 8208 548834 88593477 12345 5432
输出 #2
T T T F F
解决思路
输入处理:首先读取待判断的数字个数 M,然后依次读取每个待判断的数字。
确定位数:对于每个待判断的数字,计算其位数 N(即该数是几位数)。
计算幂和:计算该数字每个数位上的数字的 N 次方之和。
判断自幂数:若计算得到的幂和等于原数字,则该数字是自幂数,输出 "T";否则输出 "F"。
代码如下
#include <iostream>
using namespace std;// 计算base的exponent次方(正整数幂)
int power(int base, int exponent) {int result = 1;for (int i = 0; i < exponent; ++i) {result *= base;}return result;
}int main() {int M;cin >> M; // 读取待判断的数字个数while (M--) { // 依次处理每个数字int num;cin >> num;// 计算数字的位数pint temp = num;int p = 0;while (temp > 0) {temp /= 10;p++;}// 计算各位数字的p次方之和int sum = 0;temp = num; // 重新使用temp存储原数字while (temp > 0) {int digit = temp % 10; // 取末位数字sum += power(digit, p); // 累加该数字的p次方temp /= 10; // 移除末位数字}// 判断并输出结果if (sum == num) {cout << "T" << endl;} else {cout << "F" << endl;}}return 0;
}