水仙花数 C语言

这段代码是用来找出所有N位的水仙花数的。程序首先定义了N位数的范围,然后通过循环检查每个数是否满足水仙花数的条件,即各个位上的数字的N次幂之和等于其本身。对于找到的水仙花数,程序将其打印出来。输入样例为3时,输出样例为153、370、371和407。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

 代码:

#include <stdio.h>
int main()
{
	int n;
	int a=1;
	int b=1;
	int ji=1;
	int i,j,k,m;
	int he=0;
	scanf("%d",&n);
	for(i=2;i<=n;i++){
		a=a*10;
	}
	
	b=a*10;
	
	for(i=a;i<b-1;i++){
		k=i;
		ji=1;
		he=0;
		
		for(j=1;j<=n;j++){
			m=k%10;
			ji=ji*m;
				
			if(j==n&&k>0){
				j=0;
				k=(k-m)/10;
				he=he+ji;
				ji=1;	
			}	
			
		}
		
		if(i==he){
			printf("%d\n",i);
		}
		
	}
	
}

&lt;think>好的,用户现在想了解如何在C语言中实现水仙花的判断。之前他们问过简单的加减乘除运算,可能现在在练习更复杂的编程题目。水仙花,也就是阿姆斯特朗,是指一个n位,其各位字的n次方之和等于该本身。比如153是一个三位,1^3 + 5^3 + 3^3 = 153。 用户可能刚学完循环和条件判断,需要练习综合运用这些知识。首先,我需要确定用户是否了解水仙花的定义,或者是否需要先解释清楚。但根据他们的问题,可能已经知道基本概念,现在需要具体的实现方法。 接下来,我需要考虑如何在C语言中实现。步骤大概包括:确定的位,分离各位字,计算各位的n次方之和,比较是否与原相等。可能需要使用循环来分离各位字,以及计算位。 用户可能遇到的难点是如何计算位,或者如何处理不同位字。比如,如何确定一个是三位还是四位,然后相应地计算每个字的立方或四次方。另外,分离各位字的方法,比如通过取模和除法操作。 在代码示例中,应该包含函来判断是否为水仙花。可能需要两个函:一个计算位,另一个计算各位字的幂次和。然后在主函中遍历一定范围的,比如100到999,检查每个是否符合条件。 还需要注意据类型的问题,比如使用int还是long,以及可能的溢出情况,不过对于三位来说,int应该足够了。另外,如何高效地分离各位字,例如使用循环每次取最后一位,然后去掉最后一位,直到为0。 可能的错误点包括循环条件错误,或者计算幂次时的错误。例如,在计算幂次时,使用pow函可能会有浮点精度问题,所以最好自己实现一个整幂的计算函,或者用循环累乘。 此外,用户可能需要了解如何优化代码,比如提前确定范围,三位水仙花的范围是100到999,四位的范围可能更大,但通常水仙花指的是三位的情况,不过严格来说,不同位水仙花都存在,比如9474是四位的。 因此,在代码中可能需要处理不同位的情况,或者让用户指定位。不过根据常见题目,可能先实现三位水仙花,再扩展为更通用的解法。 最后,需要给出完整的代码示例,并解释关键步骤,比如分离各位、计算位、求和比较等。确保用户能够理解每个部分的作用,并可以自己修改或扩展代码。&lt;/think>--- ### 一、水仙花的定义 **水仙花**(Narcissistic Number)也称为**阿姆斯特朗**(Armstrong Number),指一个 $n$ 位,其各位字的 $n$ 次方之和等于该本身。 例如: - **三位**:$153 = 1^3 + 5^3 + 3^3$ - **四位**:$9474 = 9^4 + 4^4 + 7^4 + 4^4$ --- ### 二、C语言实现思路(以三位为例) 1. **遍历100~999的所有** 2. **分离各位字**:获取个位、十位、百位 3. **计算立方和**:$a^3 + b^3 + c^3$ 4. **判断是否等于原** --- ### 三、代码实现 ```c #include &lt;stdio.h> #include &lt;math.h> // 使用pow()函计算幂 int main() { int num, original, remainder, sum = 0, digits = 0; printf("三位中的水仙花有:\n"); for (num = 100; num &lt;= 999; num++) { original = num; sum = 0; // 重置sum // 计算各位字的立方和 while (original != 0) { remainder = original % 10; // 取最后一位 sum += pow(remainder, 3); // 累加立方 original /= 10; // 去掉最后一位 } // 判断是否为水仙花 if (sum == num) { printf("%d\n", num); } } return 0; } ``` --- ### 四、代码说明 1. **分离字**:通过 `% 10` 取个位,`/ 10` 去掉个位,循环处理所有位。 2. **计算立方和**:使用 `pow(remainder, 3)` 计算立方(需包含头文件 `math.h`)。 3. **输出结果**:三位水仙花为 **153, 370, 371, 407**。 --- ### 五、通用解法(任意位) 若需支持任意位(如四位、五位),需动态计算字位: ```c #include &lt;stdio.h> #include &lt;math.h> int isNarcissistic(int num) { int original = num; int sum = 0; int digits = 0; // 计算位 int temp = num; while (temp != 0) { digits++; temp /= 10; } // 计算各位的n次方和 while (original != 0) { int remainder = original % 10; sum += pow(remainder, digits); original /= 10; } return sum == num; } int main() { int start = 100, end = 10000; printf("%d到%d之间的水仙花:\n", start, end); for (int num = start; num &lt;= end; num++) { if (isNarcissistic(num)) { printf("%d\n", num); } } return 0; } ``` --- ### 六、注意事项 1. **学库依赖**:`pow()` 函可能存在浮点精度问题,可用循环手动计算幂次。 2. **范围限制**:四位水仙花为 **9474**,五位无解,六位有 **548834**。 3. **时间复杂度**:大范围搜索时需优化算法。 通过上述代码,可高效判断水仙花并理解其学本质。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值