C语言:打印0-100000中的自幂数(水仙花数是其中一种)

题目:

0~100000 之间的所有 自幂数输出

自幂数指一个n位数,其各位数字n次方之和恰好等于该数本身

如:153=1^3+5^3+3^3

153是一个自幂数

                    

 =========================================================================

                       

思路:

总体思路:

(一).

计算 i 的位数

                 

使用 for循环 产生 0~100000 的数变量i

            

使用一个变量 tmp 代替 i防止后续操作改变循环变量 i

int tmp = i;

           

开始计算 i 的位数

一个数 至少也是 一位数,所以 n 起始1

n = 1;

使用 while循环,如果 tmp/10 不为0,说明有位数位数加一n+1直到 tmp/10 == 0

                

(二).

求每一位的 n次方之和

                

因为上一步 tmp /= 10 改变了 tmp 的值,所以要再替换一次 i

tmp = i;

           

创建变量 sum 存放每位次方后的和

int sum = 0;

           

使用 while循环,如果 tmp 不等于 0继续取出当前位进行计算

sum += pow(tmp % 10, n);

pow()函数为求第一个参数的第二个参数次方,需要<math.h>头文件

%10 取出当前位后,当前位的n次方,再求和赋给sum

计算完当前位后,移至该数的下一位

tmp /= 10;

                  

(三).

判断 sum 是不是自幂数是则进行打印

                


                 

第一步:

计算 i 的位数

                 

(1).

使用 for循环 产生 0~100000 的数变量i

            

(2).

使用一个变量 tmp 代替 i防止后续操作改变循环变量 i

int tmp = i;

           

(3).

开始计算 i 的位数

一个数 至少也是 一位数,所以 n 起始1

n = 1;

使用 while循环,如果 tmp/10 不为0,说明有位数位数加一n+1直到 tmp/10 == 0

                     

实现代码:

#include <stdio.h>

int main()
{
	//使用for循环产生 0~100000 的数:
	int i = 0;
	for (i = 0; i <= 100000; i++)
	{
		//使用变量 tmp 代替 i,防止后续操作改变循环变量:
		int tmp = i; //代替 i

		//计算 i 的位数:
		int n = 1; //位数,因为一个数至少也是一位数,所以n起始为1

		//思路:i/10 --> 可以去掉一位 --> n+1 ,直到 i/10==0
		while (tmp /= 10) //直到tem/10==0,停止循环
		{
			n++;//统计位数
		}
		
	}

	return 0;
}

实现图片:

                 


                 

第二步:

求每一位的 n次方之和

                

(1).

因为上一步 tmp /= 10 改变了 tmp 的值,所以要再替换一次 i

tmp = i;

           

(2).

创建变量 sum 存放每位次方后的和

int sum = 0;

           

(3).

使用 while循环,如果 tmp 不等于 0继续取出当前位进行计算

sum += pow(tmp % 10, n);

pow()函数为求第一个参数的第二个参数次方,需要<math.h>头文件

%10 取出当前位后,当前位的n次方,再求和赋给sum

计算完当前位后,移至该数的下一位

tmp /= 10;

                     

实现代码:

#include <stdio.h>
#include <math.h>
int main()
{
	//使用for循环产生 0~100000 的数:
	int i = 0;
	for (i = 0; i <= 100000; i++)
	{
		//使用变量 tmp 代替 i,防止后续操作改变循环变量:
		int tmp = i; //代替 i

		//计算 i 的位数:
		int n = 1; //位数,因为一个数至少也是一位数,所以n起始为1

		//思路:i/10 --> 可以去掉一位 --> n+1 ,直到 i/10==0
		while (tmp /= 10) //直到tem/10==0,停止循环
		{
			n++;//统计位数
		}
		
		//因为上面改变了 tmp /= 10 ,改变了 tmp 的值,
		//所以要再替换一次 i :
		tmp = i;

		//创建变量 sum 存放该数每一位次方的和:
		int sum = 0;

		//只要 i 不等于0,就继续取出下一位:
		while (tmp)
		{
			//%10,取出一位后,求出该位的n次方,再求和
			sum += pow(tmp % 10, n);

			//计算下一位:
			tmp /= 10;
		}

	}

	return 0;
}

实现图片:

                 


                 

第三步:

判断 sum 是不是自幂数是则进行打印

                     

实现代码:

#include <stdio.h>
#include <math.h>
int main()
{
	//使用for循环产生 0~100000 的数:
	int i = 0;
	for (i = 0; i <= 100000; i++)
	{
		//使用变量 tmp 代替 i,防止后续操作改变循环变量:
		int tmp = i; //代替 i

		//计算 i 的位数:
		int n = 1; //位数,因为一个数至少也是一位数,所以n起始为1

		//思路:i/10 --> 可以去掉一位 --> n+1 ,直到 i/10==0
		while (tmp /= 10) //直到tem/10==0,停止循环
		{
			n++;//统计位数
		}
		
		//因为上面改变了 tmp /= 10 ,改变了 tmp 的值,
		//所以要再替换一次 i :
		tmp = i;

		//创建变量 sum 存放该数每一位次方的和:
		int sum = 0;

		//只要 i 不等于0,就继续取出下一位:
		while (tmp)
		{
			//%10,取出一位后,求出该位的n次方,再求和
			sum += pow(tmp % 10, n);

			//计算下一位:
			tmp /= 10;
		}

		//判断sum是不是自幂数
		if (sum == i)
		{
			printf("%d ", i);//是则进行打印
		}

	}

	return 0;
}

实现图片:

                    

最终代码和实现效果

最终代码:

#include <stdio.h>
#include <math.h>
int main()
{
	//使用for循环产生 0~100000 的数:
	int i = 0;
	for (i = 0; i <= 100000; i++)
	{
		//使用变量 tmp 代替 i,防止后续操作改变循环变量:
		int tmp = i; //代替 i

		//计算 i 的位数:
		int n = 1; //位数,因为一个数至少也是一位数,所以n起始为1

		//思路:i/10 --> 可以去掉一位 --> n+1 ,直到 i/10==0
		while (tmp /= 10) //直到tem/10==0,停止循环
		{
			n++;//统计位数
		}
		
		//因为上面改变了 tmp /= 10 ,改变了 tmp 的值,
		//所以要再替换一次 i :
		tmp = i;

		//创建变量 sum 存放该数每一位次方的和:
		int sum = 0;

		//只要 i 不等于0,就继续取出下一位:
		while (tmp)
		{
			//%10,取出一位后,求出该位的n次方,再求和
			sum += pow(tmp % 10, n);

			//计算下一位:
			tmp /= 10;
		}

		//判断sum是不是自幂数
		if (sum == i)
		{
			printf("%d ", i);//是则进行打印
		}

	}

	return 0;
}

实现效果:

猜你喜欢

转载自blog.csdn.net/weixin_63176266/article/details/131387241