一个根据输入数字求n位水仙花数的编程问题,c++实现:
看到问题描述后,首先想到用循环遍历n位数字然后进行是否相等的检查,循环遍历n位数字比较容易,还要取n位数字上的每位数字进行求幂和求和与n位数字相比较,然后输出条件符合的数字,大体思路是如此,下面直接上代码
#include <iostream>
using namespace std;
int main()
{
int n,a=1,b,c,d=0,z=0,sum_i;
cout<<"请输入位数(幂数):";
cin>>n;
int arr[n];//建立一个长度为n的数组,用来存储遍历的数的每位上的数字
for(int i=1; i<n; i++)//利用除a来取数的每位的数字,如果n为3位数则a为100,也提供n位数的起始位置
{
a=a*10;
}
for(int i=a; i<a*10; i++)//最外层循环,遍历从n位数的起始位置直到a*10,三位数即为100到999
{
b=a;//取a值给b,用来取每位的数字,如果直接使用a会造成最外层循环的错误,
d=0;//d为存储每位数字的数组下标,每次循环后赋0
sum_i=i;//取当前遍历数,为了取每位上数字,直接使用a会造成外层循环错误
for(int k=0; k<n; k++)//循环n次取每位上数字,从最高位到最低位
{
c=sum_i/b;//取每位上数字,int类型自动省略小数点后,结果为个位整数,如313/100=3
arr[d]=c;//存储到数组中
d++;//d递增到下一个元素位置
sum_i=sum_i%b;//取当前最高位数字后对b取余,剩下除最高位后的数
b=b/10;//为取下一位数字做准备
}
int sum=0;//n个数字的n次幂的和
for(int j=0; j<n; j++)//循环n次,取n个数的n次幂的和
{
z=arr[j];//依次取每位数字
for(int p=1; p<n; p++)//循环n-1次,计算出数字的n次幂
{
arr[j]=arr[j]*z;//求n次幂
}
sum=sum+arr[j];//n个数字的n次幂相加
}
if(i==sum)//如果遍历的i值和n个数字的n次幂的和相等,则输出此数字
{
cout<<i<<endl;
}
}
return 0;
}
1、想要进行循环我们需要用到n位的起始值,如3位数是100,四位数是1000,第一个for循环求出n位的基准值a,a可以用来做我们最外层for循环的初始值,而终止值就是a*10,如3位数是999,四位数是9999;在下面取遍历数的每位上的数字时,我们也会用到这里的a值。
2、建立遍历循环后,就应该取遍历数每位的数字了,前面定义了一个长度为n的数组,就是为了存储每位上的数字,定义for循环运行n次取数字,用n位的遍历数字对n位的基准数字做除法即可得到最高位数字(int为整形自动省略小数点后数字),遍历数字对基准数字取余数后会去掉最高位,然后基准数字除10,依次取到n个值存入数组中。
3、然后进行对数组中的每个元素取n次幂,然后进行相加,这里用到两个循环,比较容易理解。相加的值与遍历数字i进行比较,相等则输出水仙花数。
备注:这里输入的数字为3到7才会有符合的水仙花数。
分享完毕,小白一个,随手而作。