水仙花数问题详解(根据输入确定位数和幂次)。

一个根据输入数字求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才会有符合的水仙花数。

分享完毕,小白一个,随手而作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值