c++ 三位水仙花数是指一个三位数,它得每个位上的数字的3次幂之和等于它本身。例如1^3+5^3+3^3=153。编写一个函数,打印所有3位的水仙花数
以下是C语言实现的代码:
#include <stdio.h>
int main() {
int i, j, k, num;
for (i = 1; i <= 9; i++) {
for (j = 0; j <= 9; j++) {
for (k = 0; k <= 9; k++) {
num = i * 100 + j * 10 + k;
if (num == i * i * i + j * j * j + k * k * k) {
printf("%d\n", num);
}
}
}
}
return 0;
}
首先使用三重循环遍历所有可能的三位数,然后判断每个数是否为水仙花数,即判断它的每一位数字的3次幂之和是否等于它本身。如果是,就打印出来。
用C++写出一段代码,计算输出所有三位数中的水仙花数。水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:13 + 53 + 33 = 153)。
以下是用C++语言编写的计算输出所有三位数中的水仙花数的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for(int i = 100; i < 1000; i++)
{
int sum = pow(i / 100, 3) + pow(i / 10 % 10, 3) + pow(i % 10, 3);
if(sum == i)
{
cout << i << " ";
}
}
return 0;
}
代码中,我们使用了 for
循环遍历所有三位数。在循环内部,我们使用 pow()
函数计算出每个位上的数字的三次幂之和,并将其存储在 sum
变量中。如果 sum
等于这个三位数本身,就说明这个数是水仙花数,将其输出即可。
c++原来,水仙花数又称阿姆斯特朗数,也被称为超完全数字不变数。如果一个三位数,它的每个数位上的数字的 3 次幂之和等于它本身,那么这个三位数就是一个水仙花数。例如:153 = 1^3 + 5^3 + 3^3。现在,请你判断一个数是不是水仙花数。
接下来,我需要考虑如何将这个判断过程用C++实现。根据用户提供的引用内容,尤其是引用[3]和[5],可以看到大致步骤。首先,需要确定输入数的位数n,然后分解每一位数字,计算它们的n次方之和,最后比较和与原数是否相等。
我需要分步骤思考:
确定位数n:比如输入的数字是153,那么n=3。可以通过循环除以10直到数为0,统计次数来得到位数。例如,153/10=15,次数1;15/10=1,次数2;1/10=0,次数3,所以n=3。
分解每一位数字:例如,153分解为1、5、3。可以通过取余和除法操作来获取每一位。比如153%10得到个位3,然后153/10=15,再15%10得到十位5,依此类推。
计算各位的n次方之和:比如1^3 +5^3 +3^3=1+125+27=153。
比较和与原数:如果相等则是水仙花数,否则不是。
接下来,我需要考虑如何处理输入的数字是否为0或负数。根据引用[5]中的函数isWaterFlower,如果num<=0则返回false。所以在程序中需要先处理这种情况,排除非正整数。
然后,编写函数实现上述步骤。比如,函数名为isNarcissus,参数为int num,返回bool类型。函数内部步骤如下:
- 处理num<=0的情况,直接返回false。
- 计算位数n:用循环除以10,统计次数。
- 分解各位数字并计算n次方之和。
- 比较和与num是否相等。
需要注意的是,分解数字时,原数字会被修改,所以应该用临时变量来保存num的值,避免改变原数。例如,在计算位数时,先用temp = num,然后操作temp,这样原num不会被改变。
另外,计算n次方可以使用pow函数,但需要注意pow返回的是double类型,需要转换为int,可能存在精度问题。或者,可以手动进行连乘,比如对于每一位digit,计算digit的n次方时,用循环连乘n次,避免使用pow函数。例如,digit=5,n=3,sum += 555。这可能更准确,尤其是在处理较大的数字时。
现在,考虑代码的结构。根据引用[3]中的示例,主函数可能包括输入一个数,调用判断函数,输出结果。例如:
#include <iostream>
using namespace std;
bool isNarcissus(int num) {
if (num <= 0) return false;
int original = num;
int n = 0;
int temp = num;
// 计算位数n
while (temp != 0) {
temp /= 10;
n++;
}
// 计算各位的n次方之和
int sum = 0;
temp = original;
while (temp != 0) {
int digit = temp % 10;
int power = 1;
for (int i = 0; i < n; i++) {
power *= digit;
}
sum += power;
temp /= 10;
}
return sum == original;
}
int main() {
int num;
cout << "请输入一个正整数: ";
cin >> num;
if (isNarcissus(num)) {
cout << num << "是水仙花数" << endl;
} else {
cout << num << "不是水仙花数" << endl;
}
return 0;
}
这个代码中,isNarcissus函数先处理了非正数的情况,然后计算位数,接着计算各位的n次方之和。这里使用手动计算次方,避免使用pow函数可能的精度问题。主函数获取输入并调用函数判断输出结果。
需要测试一些案例,比如三位数的153、370、371、407,都是正确的水仙花数。例如,输入153,程序应该输出是。输入123,则不是,因为1^3+2^3+3^3=36≠123。
另外,需要考虑输入为一位数的情况。比如,1位数的水仙花数应为1-9,因为1^1=1,2^1=2等。但根据引用中的示例,可能用户更关注三位数,但根据定义,1位数也是水仙花数。例如,当输入5时,程序应返回true。测试这一点可以验证代码的正确性。
潜在的问题可能包括:
数字0的处理:根据代码,num<=0返回false,所以输入0会返回false。但根据定义,0是否是水仙花数?0的位数是1位,0^1=0,所以应该属于。但可能根据不同的定义,有的地方不将0视为水仙花数。需要确认用户的需求。引用中的代码如引用[5]排除了num<=0的情况,所以这里可能遵循同样的逻辑。
数字过大导致溢出:比如输入一个很大的数,导致sum超过int的范围。例如,在32位系统中,int的范围是-2^31到2^31-1。如果输入很大的数,计算sum时可能会溢出,导致错误。这时可能需要使用更大的数据类型,比如long long。但在示例代码中可能暂时不考虑这个问题,用户提问的是基本实现,所以可以暂时忽略,或者添加注释说明。
此外,用户提供的引用中有输出所有三位数的水仙花数的代码,如引用[1]中的循环从100到999。如果需要批量判断,可以在主函数中使用循环,逐个检查并输出。
总结步骤:
- 处理输入,确保为正整数。
- 计算位数n。
- 分解各位,计算n次方和。
- 比较和与原数。
现在,根据用户的引用,尤其是引用[3]中的代码,他们分解了百位、十位、个位,但这种方法仅限于三位数。而正确的做法是处理任意n位数,如引用[2]所述,所以需要通用方法,而不是固定三位数的分解。
因此,正确的代码应该适用于任何n位数,而不仅仅是三位数,如上面的示例代码所示。
最后,生成相关问题,例如:
- 如何优化计算各位数字n次方的过程?
- 水仙花数在密码学中有应用吗?
- 如何批量输出所有n位数的水仙花数?
但根据用户提供的引用,可能更相关的问题包括性能分析、优化方法、应用场景等,如示例中的快速排序相关问题。要判断一个数是否为水仙花数(阿姆斯特朗数),需按以下步骤实现:
实现步骤
输入验证:排除非正整数
水仙花数定义要求是正整数。若输入 $\leq 0$,直接返回false
[^5]。计算位数
通过循环除以 10 统计数字位数 $n$:int temp = num, n = 0; while (temp != 0) { temp /= 10; n++; }
分解各位并计算次方和
逐位提取数字,计算其 $n$ 次方之和:int sum = 0; temp = num; while (temp != 0) { int digit = temp % 10; int power = 1; for (int i = 0; i < n; i++) power *= digit; // 手动计算次方 sum += power; temp /= 10; }
比较结果
若次方和等于原数,则为水仙花数。
完整代码
#include <iostream>
using namespace std;
bool isNarcissus(int num) {
if (num <= 0) return false; // 非正整数直接排除[^5]
int original = num;
int n = 0, temp = num;
// 计算位数n
while (temp != 0) {
temp /= 10;
n++;
}
// 计算各位n次方和
int sum = 0;
temp = original;
while (temp != 0) {
int digit = temp % 10;
int power = 1;
for (int i = 0; i < n; i++) power *= digit; // 避免使用pow保证精度
sum += power;
temp /= 10;
}
return sum == original;
}
int main() {
int num;
cout << "输入一个正整数: ";
cin >> num;
cout << num << (isNarcissus(num) ? "是" : "不是") << "水仙花数" << endl;
return 0;
}
示例测试
- 输入 153
$1^3 + 5^3 + 3^3 = 153$ → 输出“是”[^2] - 输入 9474
$9^4 + 4^4 + 7^4 + 4^4 = 9474$ → 输出“是” - 输入 123
$1^3 + 2^3 + 3^3 = 36 \neq 123$ → 输出“否”
关键点
- 手动计算次方:避免使用
pow()
函数可能导致的浮点误差[^3] - 通用性:支持任意位数的判断,而不仅限于三位数
- 性能优化:时间复杂度为 $O(n^2)$,可通过预计算次方值优化
相关推荐
















