[2023.06二级]2.自幂数判断
题目描述
自幂数是指,一个N位数,满足各位数字N次方之和是本身。例如,153是3位数,其每位数的3次方之和,13 + 53 + 33 = 153,因此153是自幂数;1634是4位数,其每位数的4次方之和,14 + 64 + 34 + 44 = 1634,因此1634是自幂数。现在,输入若干个正整数,请判断它们是否是自幂数。
输入格式
输入第一行是一个正整数M,表示有M个待判断的正整数。
从第2行开始的M行,每行一个待判断的正整数。约定这些正整数均小于108。
输出格式
输出M行,如果对应的待判断正整数为自幂数,则输出英文大写字母’T’, 否则输出英文大写字母’F’。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
数据范围
对于全部数据,保证有1 ≤ M ≤ 100。
样例
输入样例1
3
152
111
153
输出样例1
F
F
T
输入样例2
5
8208
548834
88593477
12345
5432
输出样例2
T
T
T
F
F
解法1
结构:双重循环嵌套结构
· 外层循环控制判断数字个数
· 内层循环判断是不是自幂数
问题1:如何计算一个数字的位数
int len = 0; // len表示整数n的位数
while(n)
{
len++; // 位数加一
n = n / 10; // 将n的最后一位去掉
}
问题2:如何计算一个数字的自幂数
int s = 0; // s表示自幂数,初始值为0
while(n)
{
int k = n%10; // 取出最后一位
s = s + pow(k,len); // 累加最后一位数字的长度次方
n /= 10;
}
参考程序
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--) // 判断n个数
{
int x,len=0,s=0; // len表示位数,s表示自幂数
cin>>x;
int m = x; // 存储输入数字的值
while(m) // 统计位数
{
len++; // 位数加一
m = m / 10; // 将m的最后一位去掉
}
m = x; // 再次存储输入数字的值
while(m) // 统计自幂数和
{
int k = m % 10,p = 1; // k表示m的最后一位,p用来计算k的len次方
p = pow(k,len); // 使用数学函数计算k的len次方
// 使用循环计算k的len次方
// for(int i=1;i<=len;i++)
// {
// p = p * k;
// }
s = s + p; // 累加最后一位的len次方
m = m / 10; // 将m的最后一位去掉
}
// 判断自幂数是否和输入数字相同
if(s==x) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}
解法2
结构:循环结构 + 自定义函数
- 循环结构用来判断数字个数
- 自定义函数,计算一个数字的位数和自幂数
1.计算一个数字的位数
int get_length(int n) // 返回数字n的位数
{
int len = 0; // len表示数字n位数
while(n)
{
len++; // 位数加一
n = n / 10; // 将n的最后一位去掉
}
return len; // 返回数字n的位数
}
2.计算一个数字的自幂数
int get_zms(int n)
{
int s = 0; // s表示数字n的自幂数
int len = get_length(n); // len表示数字n位数
while(n)
{
int k = n % 10; // k表示n的最后一位
s = s + pow(k,len); // 累加最后一位的len次方
n = n / 10; // 将n的最后一位去掉
}
return s; // 返回数字n的自幂数
}
参考程序
#include<iostream>
#include<cmath>
using namespace std;
int get_length(int n) // 返回数字n的位数
{
int len = 0; // len表示数字n位数
while(n)
{
len++; // 位数加一
n = n / 10; // 将n的最后一位去掉
}
return len; // 返回数字n的位数
}
int get_zms(int n)
{
int s = 0; // s表示数字n的自幂数
int len = get_length(n); // len表示数字n位数
while(n)
{
int k = n % 10; // k表示n的最后一位
s = s + pow(k,len); // 累加最后一位的len次方
n = n / 10; // 将n的最后一位去掉
}
return s; // 返回数字n的自幂数
}
int main()
{
int n;
cin>>n;
while(n--) // 判断n个数
{
int x;
cin>>x;
// 判断自幂数是否和输入数字相同
if(get_zms(x)==x) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}
解法3 打表法
#include<iostream>
#include<cmath>
using namespace std;
int f[] = {1,2,3,4,5,6,7,8,9,
153,370,371,407,1634,
8208,9474,54748,92727,
93084,548834,1741725,
4210818,9800817,9926315,
24678050,24678051,88593477}; // 列举所有自幂数
int main()
{
int t;
cin>>t;
while(t--)
{
int x;
cin>>x;
bool flag = false;
for(int i=0;i<27;i++)
{
if(x==f[i])
{
cout<<"T"<<endl;
flag = true;
break;
}
}
if(!flag) cout<<"F"<<endl;
}
return 0;
}