打印水仙花数(强化版)

1.我们要知道什么是水仙花。

“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3+ 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。

虽然水仙花数是三位数,但是我们可以1到100000的类似的水仙花,就可以知道1位数也是类似水仙花数。

2.计算  i 有几位数字

可以利用i=i/10,但是在for函数中i改变了就不好与下面的和进行比较所以int b=i 就可以了;


#include<stdio.h>
int main()
{
	int a = 0;
	int v = 0;
	int count = 0;
	for (int i = 0; i <= 100000; i++)
	{
		int sz = 1;
		int b = i;
		//1.计算i有几位数字
		while (b / 10)
		{
			sz++;
			b = b / 10;
		}
	return 0;
}

3.得到i的每一位数字,计算的n次方之和

可以用取余及int v=b%10,取出的数字进行相乘及可以使用函数,或者库函数pow(注意:要用头文件 #included<math.h>),得到i的每一位数字,然后用相除减去一位数字及b=b/10,将取出的数字相加为 sum。

方法一

#include<stdio.h>
int test(int v, int sz)
{
	int r = 1;
	int count=0;
	int sum = 0;
	for (int s = 1; s <= sz; s++)
	{
		r = r * v;
	}
	
	return r;
}
int main()
{
	int a = 0;
	int v = 0;
	int count = 0;
	for (int i = 0; i <= 100000; i++)
	{
		int sz = 1;
		int b = i;
		//1.计算i有几位数字
		while (b / 10)
		{
			sz++;
			b = b / 10;
		}
		//2.得到i的每一位数字,计算的n次方之和
		int a = i;
		int sum = 0;
		while (a)
		{
			int v = a % 10;
			//取出的数字进行相乘
			count = test(v, sz);
			sum = count + sum;
			a = a / 10;
		}
		
	}
	return 0;
}

方法二

#include<stdio.h>
方法2
#include<math.h>
int main()
{
	int i = 0;
	for ( i = 0; i <= 100000; i++)
	{
		int tmp = i;
		int n = 1;
		int sum = 0;
		//1.计算i有几位数字
		while (tmp / 10)
		{	
			n++;
			tmp /= 10;
			
			
		}
		//2.得到i的每一位数字,计算的n次方之和
		 tmp= i;
		while(tmp)
		{
			sum += pow(tmp % 10, n);
			tmp /= 10;
		}
		
	}
	return 0;
}

4.判断是否与i相等

判断sum是否与i相等

方法一

//打印水仙花数
#include<stdio.h>
int test(int v, int sz)
{
	int r = 1;
	int count=0;
	int sum = 0;
	for (int s = 1; s <= sz; s++)
	{
		r = r * v;
	}
	
	return r;
}
int main()
{
	int a = 0;
	int v = 0;
	int count = 0;
	for (int i = 0; i <= 100000; i++)
	{
		int sz = 1;
		int b = i;
		//1.计算i有几位数字
		while (b / 10)
		{
			sz++;
			b = b / 10;
		}
		//2.得到i的每一位数字,计算的n次方之和
		int a = i;
		int sum = 0;
		while (a)
		{
			int v = a % 10;
			//取出的数字进行相乘
			count = test(v, sz);
			sum = count + sum;
			a = a / 10;
		}
		//判断是否与i相等
		if (sum == i)
		{
			printf("%d ", sum);
		}
	}
	return 0;
}

方法二

#include<stdio.h>
方法2
#include<math.h>
int main()
{
	int i = 0;
	for ( i = 0; i <= 100000; i++)
	{
		int tmp = i;
		int n = 1;
		int sum = 0;
		//1.计算i有几位数字
		while (tmp / 10)
		{	
			n++;
			tmp /= 10;
			
			
		}
		//2.得到i的每一位数字,计算的n次方之和
		 tmp= i;
		while(tmp)
		{
			sum += pow(tmp % 10, n);
			tmp /= 10;
		}
		//判断是否与i相等
		if (sum == i)
		{
			printf("%d ", i);
		}

	}
	return 0;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值