我刚学c++,能用while求出所有的水仙花数么?

如题所述

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int i=100;
    while(i<1000)
    {
        int as=i/100;
        int sd=i/10%10;
        int df=i%10;
        if(as*as*as+sd*sd*sd+df*df*df==i)
        {
            cout<<i<<endl;
        }
        i++;
    }
    return 0;
}

追问

这要可以吗?

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-27
#include<iostream>
#include <cmath>
using namespace std;
int main()
{
    long n1, n2, a;
    int i;
    cout << "请输入Narcissistic number的位数:" << endl;
    cin >> i;
    cout << i << "位数的Narcissistic number包括:" << endl;
    int j;
    n1 = pow(10, i - 1);
    while ( n1 < pow(10, i) )
    {
        n2 = 0;
        j=0;
        while(j < i)
        {
            a = pow(10, j);
            a = n1 / a;
            a = a % 10;
            a = pow(a, i);
            n2 = n2 + a;
            j++;
        }
        if (n1 == n2)
            cout << n1 << endl;
        n1++;
    }
    return 0;
}

理论上能,但是自然数有无穷多个,所以

追问

大哥你•﹏•,我才刚学c语言,到while语句

追答#include <stdio.h>

int pow(int x,int y){//求x的y次幂
    int r=1;
    while(y>0){
        r=x*r;
        y=y-1;
    }
    return r;
}
int main()
{
    printf("\t%d\n",pow(2,2));
    printf("\t%d\n",pow(2,3));
    printf("\t%d\n",pow(3,3));
    long n1, n2, a;
    int i;
    printf("请输入Narcissistic number的位数:");
    scanf("%d",&i);
    printf("%d位数的Narcissistic number包括:\n",i);
    int j;
    n1 = pow(10, i - 1);
    int n3=n1*10;
    while ( n1 < n3 )
    {
        n2 = 0;
        j=0;
        while(j < i)
        {
            a = pow(10, j);
            a = (n1 / a) % 10;
            a = pow(a, i);
            n2 = n2 + a;
            j++;
        }
        if (n1 == n2){
            printf("%d\n",n1);

        n1++;
    }
    return 0;
}

这样应该行了吧

追问

感谢你的回答,可我还是看不懂,大哥你计算机几级了,T_T。

追答

我比较懒,直接抄了百科里的代码,在把根据你的需求把for循环改成了while循环,自己写了个计算幂的函数pow。

 n1 = pow(10, i - 1);// i位数就是10的i-1次方到10的i次方之间的数,比如2位数就是10~100(包括10,不包括100)
    int n3=n1*10;
    while ( n1 < n3 )//控制n1的大小,时循环中的n1都是i位数
    {
        n2 = 0;//n2用来保存每个位上的数字的i次幂之和,每次计算前它都应该为0;
        j=0;
        while(j < i)
        {
        //一个数从右往左数第j+1位上的数等于,这个数除以10的j次方,再对10求余,比如:123 十位上的数就是 (123/10)%10=12%10=2
            a = pow(10, j);//
            a = (n1 / a) % 10;//这里a表示这个数第j+1位上的数字
            a = pow(a, i);//数第j+1位上的数字的i次幂
            n2 = n2 + a;//求和
            j++;
        }
        if (n1 == n2){//n1数这个数本身,n2它的每个位上的数字的 i次幂之和
            printf("%d\n",n1);//如果n1等于n2则输出这个数
 
        n1++;//自加,判断下一个数
    }

追问

厉害,你的学习精神值得我学习。你能用if,if....else,while,do...while,switch,break,中的一些求出吗?

追答#include <stdio.h>

int pow(int x,int y){//求x的y次幂
    switch(y){
    case 0:
        return 1;
    case 1:
        return x;
    default:
        break;
    }
    if(x==0){
        return 0;
    }else if(x==1){
        return 1;
    }
    else{
        int r=1;
        do{
            r=x*r;
            y=y-1;
        }while (y>0);
        return r;

    }
}
int main()
{
    long n1, n2, a;
    int i;
    printf("请输入Narcissistic number的位数:");
    scanf("%d",&i);
    printf("%d位数的Narcissistic number包括:\n",i);
    int j;
    n1 = pow(10, i - 1);
    int n3=n1*10;
    while ( n1 < n3 )
    {
        n2 = 0;
        j=0;
        while(j < i)
        {
            a = pow(10, j);
            a = (n1 / a) % 10;
            a = pow(a, i);
            n2 = n2 + a;
            j++;
        }
        if (n1 == n2)
            printf("%ld\n",n1);
        n1++;
    }
    return 0;
}

追问

这样行吗,能改下吗

追答

错了,

    if(a<10,b<10,c<10) 没有任何作用。因为 他只判断了一次,而那次a=1,b=0,c=0 。

    while语句里 a++,b++,c++,他们同时增大,只取到了 100,211,322,...,988这几个值

    而且while((a*100+b*10+c)==(a*a*a+b*b*b+c*c*c))由于一开始100不是水仙数,根本不会进循环内.

    写上去之前该自己编译以后试试的。

另外,为什么只有给我的图是横着的。。。

追问

能在我的基础上完善么。…………我也不知为什么是横的。

我目前只学了,while if switch do....while

我也试了好几种自己写的,就是算不出来。

本回答被提问者采纳

我刚学c++,能用while求出所有的水仙花数么?
} i++; } return 0;}

如何用C语言中的while语句编写水仙花数程序
在DEV-C++通过检测,有问题欢迎追问#include <math.h> int main(){ int i=100,a,b,c;printf("3位数中的水仙花数为:");while(i<999){ i++;a=i\/100;b=(i\/10)%10;c=i%10;if(pow(a,3)+pow(b,3)+pow(c,3)==i)printf("%d\\t",i);} system("PAUSE");return ;} ...

用穷举法编写程序,找出所有的“水仙花数”。水仙花数是指一个三位数...
\/\/ 如果没有这一行,程序会在找到至少一个水仙花数时输出"yes"。cout << endl;} return 0;} ```以及一个使用C语言编写的程序示例:```c include int main() { int m, n, i, a, b, c;while (scanf("%d%d", &m, &n) != EOF && (m > 100 || m == 100) && (n < 999...

用C++ 现在要求输出所有在m和n范围内的水仙花数。
如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;如果给定的范围内不存在水仙花数,则输出no;输出格式有要求,注意如果存在,最后不要多一个空格 再给一份通过的 include <cstdio>bool flag[1000];int main(){int sum = 100;\/\/ 初始化for(int i=1; i<10; i++){for (int...

用穷举法编写程序,找出所有的“水仙花数”。水仙花数是指一个三位数...
穷举法求水仙花数。用for循环来穷举每一个数。C++语言版:include<iostream> using namespace std;int main(){ int t=0,flag=0,m,n,temp,i,ge,shi,bai;while (cin>>m>>n){ t=0;if (m>n){ temp=n;n=m;m=temp;} for (i=m;i<=n;i++){ ge=i%10;shi=i\/10%10;bai=i\/10\/...

如何利用C\/ C++语言编程打印出所有的“水仙花数”?
打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。2.程序源代码:main(){ int i,j,k,n;printf(...

C语言输出【所有的】水仙花数
到2^23次就运算8000+ms了,到30次就很难出结果了,你试试看:include<stdio.h> include int count(int n){ int i=0;while(n>=1){n=n\/10;i++;}return(i);} int produce(int x,int y){int z=1;while(y>0){z=z*x;y--;}return(z);} void main(){ int t1,t2;t1=cl...

用C++求1000以内水仙花数
include <iostream>#include <string>using namespace std;int hua(int n)\/\/分解n,并将每个数位上的数字立方,再求和{ int t,s=0; while(n) { t=n%10;\/\/获得某数位上的数字 s+=t*t*t;\/\/立方,并求和 n=n\/10; } return s;}int main(int argc, char *...

请问这个C++求水仙花数的程序哪里有错,急求!
int x,y,c;for(x=100;x<1000;x++){ c=0;y=x;while(y){ c=c+(int)pow(y%10,3);y=y\/10;} if(x==c)cout<<x<<endl;} } x是for的循环变量 如果把x作为 while的循环变量 那么荡 x = 100 是for内第一次 while整体循环结束 x变为0 之后 x++ 变为1 而不是从 101开始 ,...

c++编程中求水仙花数的那个程序,如果不用for循环,还有没有其他的方法...
水仙花数 { int n,m;int a,b,c;printf("请输入区间100<=n<=m<=999并以空格隔开:");scanf("%d d",&n,&m);int i=n;while(i<=m){ a=i\/100;\/\/取百位 b=i\/10%10;\/\/取十位 c=i%10;\/\/取个位 if(a*a*a+b*b*b+c*c*c==i){ printf("%d ",i);} i++;} system(...

相似回答