请看下~~~一个三位数每个位上的数字立方之和等于这个数

时间:2022-01-27 14:50:06
请看下~~~一个三位数每个位上的数字立方之和等于这个数这个这样写对吗?
#include <stdio.h>
#include <math.h>

void main()
{

  int a,b,c,n;
  printf("水仙数字");
  for(a=1;a<9;a++)
  for(b=0;b<9;b++)
  for(c=0;c<9;c++)
     if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
            n=100*a+10*b+c;
 printf("%d\n",n);


}
觉得太简单不过的,不要打击我啊 请看下~~~一个三位数每个位上的数字立方之和等于这个数

45 个解决方案

#1


恩好。。对了。。结贴吧。。狼多肉少。。速度结贴。。分都给我。。哈哈

#2



#include <stdio.h>
#include <math.h>

void main()
{

int a,b,c,n;
printf("水仙数字");
for(a=1;a<=9;a++)                 //9也可以吧
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
if( a*a*a+b*b*b+c*c*c == 100*a+10*b+c)
{                                   //加{}
n=100*a+10*b+c;
      printf("%d\n",n);
}


}

#3


引用 2 楼 kid_coder 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{
    
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)                 //9也可以吧
        for(b=0;b<=9;b++)
          ……

运行结果是只有一个数吗?

#4


应该是<=9吧?你的程序只能显示最的一个水仙花数,稍做修改:

#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                n=100*a+10*b+c;
                if(a*a*a+b*b*b+c*c*c==n) printf("%d  \n",n); // 数字之间加几个空格更好
            }
}

#5


引用 4 楼 wadeyz 的回复:
应该是<=9吧?你的程序只能显示最的一个水仙花数,稍做修改:

C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
      ……

怎样显示所有的数呢?

#6


引用 3 楼 zxxwlj 的回复:
引用 2 楼 kid_coder 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{

int a,b,c,n;
printf("水仙数字");
for(a=1;a<=9;a++) //9也可以吧
for(b=0;b<=9;b++)
……

运行结果是只有一个数吗?


水仙数字153
370
371
407
Press any key to continue

输出了4个数~ 你那个for 有没有加{}?

#7


对的,就是代码风格不好。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。

#8


谢谢楼上各位!我会努力!

#9


引用 8 楼 zxxwlj 的回复:
谢谢楼上各位!我会努力!
加油!!
PS:多给点分。哈哈哈

#10


引用 9 楼 heartwasnot 的回复:
引用 8 楼 zxxwlj 的回复:
谢谢楼上各位!我会努力!
加油!!
PS:多给点分。哈哈哈

你都不告诉我答案,不过你替我加油,会给你分啦!

#11


思路是对的,小问题有一些。

如果用pow(x, y)的话,代码会简单些。

#12


引用 1 楼 heartwasnot 的回复:
恩好。。对了。。结贴吧。。狼多肉少。。速度结贴。。分都给我。。哈哈

太有意思了

#13


俺给另外一种解法:

#include <stdio.h>
#include <math.h>

bool isArmstrong(int n)
{
int a = 0, b=0, sum=0, tmp;

tmp = n;
for(;tmp>0;)

a=tmp%10;
tmp=tmp/10;
b++;
}

tmp = n;
for(;tmp>0;)

a=tmp%10;
sum=sum+(int)pow((double)a,(double)b);
tmp=tmp/10;
}

if(sum==n) return true;

return false;
}


int main(int argc, char* argv[])
{
for(int i = 100; i < 999; ++i)      // 3位数的armstrong
{
if(isArmstrong(i)) printf("%d\n", i);
}

return 0;
}

#14


修改main函数中的
for(int i = 100; i < 999; ++i) 

for(int i = 0; i <= 9999999; ++i)
可以输出1到7位数所有的armstrong

#15



#include <stdio.h>
#include <math.h>
#include <time.h>

bool isArmstrong(int n)
{
int a = 0, b=0, sum=0, tmp;

tmp = n;
for(;tmp>0;)

a=tmp%10;
tmp=tmp/10;
b++;
}

tmp = n;
for(;tmp>0;)

a=tmp%10;
sum=sum+(int)pow((double)a,(double)b);
tmp=tmp/10;
}

if(sum==n) return true;

return false;
}


int main(int argc, char* argv[])
{
clock_t start, finish;

    start = clock();
for(int i = 0; i <= 99999999; ++i)      // 求1到8位数的armstrong
{
if(isArmstrong(i)) printf("%d\n", i);
}
finish = clock();
    int interval = (finish - start) * 1000 / CLOCKS_PER_SEC;

printf("运算了%dms\n", interval);

return 0;
}
// 在Thinkpad T410i上的输出结果:
// 运算了78671ms


所以,前面有朋友出了一个求21位的armstrong的题目,要求在3分钟之内算完,实在是太有难度了。
当然用多线程分段计算可以提高计算速度,但要在3分钟之内,用常规的算法,几乎不太可能,除非在很多机器上同时计算。

#16


3位数的简单
#include <stdio.h>

int main (void) {
        int i;
        for(i=100;i<999;i++)
            if((i/100)*(i/100)*(i/100)+(i/10%10)*(i/10%10)*(i/10%10)+(i%10)*(i%10)*(i%10)==i)
            printf("%i\n",i);
        return 0;
}

#17


lz才开始的代码没有括号,前面算出的n被后面的n覆盖,所以只有一个值,括号这东西不好省

#18


引用 17 楼 ianoshen 的回复:
lz才开始的代码没有括号,前面算出的n被后面的n覆盖,所以只有一个值,括号这东西不好省

恩,是呢,谢谢!

#19


还行

注意一下边缘对象 和 逻辑关系就行了

#20


注意下括号.二楼是正确的!

#21



for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                n=100*a+10*b+c;
                if(a*a*a+b*b*b+c*c*c==n) printf("%d  \n",n);
            }

#22


for(a=1;a<9;a++)
for(b=0;b<9;b++)
for(c=0;c<9;c++)
{
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
  {
     n=100*a+10*b+c;
     printf("%d\n",n);
  }
}

楼主很粗心,漏掉了 两个括号。 

#23


不得不说你的编码风格很成问题。这个如果是笔试题的话,直接看编码风格就si啦

#24


lz这段代码和我大一的时候有得一拼。

#25


神马情况啊!!!这么一个小白问题居然上了首页???难道...

#26


水仙花数?

#27


该回复于2011-04-28 10:39:38被版主删除

#28


楼主是个女的,回答正确不??给我分,多少都行 请看下~~~一个三位数每个位上的数字立方之和等于这个数

#29


引用 28 楼 utopiaaaa 的回复:
楼主是个女的,回答正确不??给我分,多少都行

请看下~~~一个三位数每个位上的数字立方之和等于这个数我结贴很长时间了呀!

#30


为啥是void main()?
而且很多人都在用。
难道是写单片机程序?

#31


int cube[10];


main()
{
  for (i = 0; i< 10; i++)
  {
   cube[i] = i*i*i;
  }
  .....
}

bool isArmstrong(int n)
{
    ....
    //sum=sum+(int)pow((double)a,(double)b);
    sum=sum+cube(a);

引用 15 楼 pathuang68 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>
#include <time.h>

bool isArmstrong(int n)
{
    int a = 0, b=0, sum=0, tmp;

    tmp = n;
    for(;tmp>0;)
    { 
        a=tmp%10;
    ……

#32


貌似这是大一时 C语言中的习题 求1000以内的水仙花数!额 

#33


这个我觉得用穷举法蛮简单的,发上来一起探讨咯~
        #include<stdio.h>
        #include<math.h>
        void main()
        {
  int a,b,c;
  for(int i=100;i<999;i++)
  {
a=i/100;
b=(i/10)%10;
c=i%10;
if(i==pow(a,3)+pow(b,3)+pow(c,3))
printf("%d\n",i);

  }
        }

#34


引用 23 楼 shanmao 的回复:
不得不说你的编码风格很成问题。这个如果是笔试题的话,直接看编码风格就si啦

请说详细点,谢谢~我和她写的差不多,我是新手,别喷。说出来,我也好改啊,谢谢

#35


因为a<10,所以a*a*a<100*a,所以b*b*b+c*c*c>10*b+c
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?

#36


能不能用另一种方法把这个算法写出来!

#37


我用EXCEL的规划求解可以算出来,不需要编程
等于371

#38


//一个三位数每个位上的数字立方之和等于这个数
static int GetConditionalNum(void)
{
int nCubeNumOfArray[10] =
{
0,   1,   8,   27,  64,
125, 216, 343, 512, 729
};

int nBitNum = 0;
int nTenNum = 0;
int nHundredNum = 0;
int nNum = 0;
int nResNum = 0;

printf("GetConditionalNum\n");
for(nHundredNum = 1; nHundredNum <= 9; nHundredNum++)
{
for(nTenNum = 0; nTenNum <= 9; nTenNum++)
{
for(nBitNum = 0; nBitNum <= 9; nBitNum++)
{
nNum = nCubeNumOfArray[nBitNum] + 
                                       nCubeNumOfArray[nTenNum] + n
                                       nCubeNumOfArray[nHundredNum];
nResNum = nBitNum + nTenNum*10 + nHundredNum*100;
if(nResNum == nNum)
{
printf("%d\n", nNum);
}
}
}
}

return true;
}

#39


#include <stdio.h>
#include <math.h>

void main()
{

  int a,b,c,n;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c){
  n=100*a+10*b+c;
printf("%d\n",n);
}
}

应该这样写吧,要不然只会显示最后一个水仙数,或者干脆这样写

#include <stdio.h>
#include <math.h>
void main()
{
  int a,b,c;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
Printf("%d\n",100*a+10*b+c);
}

#40


引用 39 楼 wqs12ec056 的回复:
#include <stdio.h>
#include <math.h>

void main()
{

  int a,b,c,n;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c){
  n=100*a……

恩,谢谢!!

#41


该回复于2011-05-04 16:31:36被版主删除

#42


这是水仙花的例子。

#43


有没有试过求个21位的 

#44


该回复于2011-05-05 09:24:14被版主删除

#45


该回复于2011-05-05 09:52:53被版主删除

#1


恩好。。对了。。结贴吧。。狼多肉少。。速度结贴。。分都给我。。哈哈

#2



#include <stdio.h>
#include <math.h>

void main()
{

int a,b,c,n;
printf("水仙数字");
for(a=1;a<=9;a++)                 //9也可以吧
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
if( a*a*a+b*b*b+c*c*c == 100*a+10*b+c)
{                                   //加{}
n=100*a+10*b+c;
      printf("%d\n",n);
}


}

#3


引用 2 楼 kid_coder 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{
    
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)                 //9也可以吧
        for(b=0;b<=9;b++)
          ……

运行结果是只有一个数吗?

#4


应该是<=9吧?你的程序只能显示最的一个水仙花数,稍做修改:

#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                n=100*a+10*b+c;
                if(a*a*a+b*b*b+c*c*c==n) printf("%d  \n",n); // 数字之间加几个空格更好
            }
}

#5


引用 4 楼 wadeyz 的回复:
应该是<=9吧?你的程序只能显示最的一个水仙花数,稍做修改:

C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,c,n;
    printf("水仙数字");
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
      ……

怎样显示所有的数呢?

#6


引用 3 楼 zxxwlj 的回复:
引用 2 楼 kid_coder 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>

void main()
{

int a,b,c,n;
printf("水仙数字");
for(a=1;a<=9;a++) //9也可以吧
for(b=0;b<=9;b++)
……

运行结果是只有一个数吗?


水仙数字153
370
371
407
Press any key to continue

输出了4个数~ 你那个for 有没有加{}?

#7


对的,就是代码风格不好。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。

#8


谢谢楼上各位!我会努力!

#9


引用 8 楼 zxxwlj 的回复:
谢谢楼上各位!我会努力!
加油!!
PS:多给点分。哈哈哈

#10


引用 9 楼 heartwasnot 的回复:
引用 8 楼 zxxwlj 的回复:
谢谢楼上各位!我会努力!
加油!!
PS:多给点分。哈哈哈

你都不告诉我答案,不过你替我加油,会给你分啦!

#11


思路是对的,小问题有一些。

如果用pow(x, y)的话,代码会简单些。

#12


引用 1 楼 heartwasnot 的回复:
恩好。。对了。。结贴吧。。狼多肉少。。速度结贴。。分都给我。。哈哈

太有意思了

#13


俺给另外一种解法:

#include <stdio.h>
#include <math.h>

bool isArmstrong(int n)
{
int a = 0, b=0, sum=0, tmp;

tmp = n;
for(;tmp>0;)

a=tmp%10;
tmp=tmp/10;
b++;
}

tmp = n;
for(;tmp>0;)

a=tmp%10;
sum=sum+(int)pow((double)a,(double)b);
tmp=tmp/10;
}

if(sum==n) return true;

return false;
}


int main(int argc, char* argv[])
{
for(int i = 100; i < 999; ++i)      // 3位数的armstrong
{
if(isArmstrong(i)) printf("%d\n", i);
}

return 0;
}

#14


修改main函数中的
for(int i = 100; i < 999; ++i) 

for(int i = 0; i <= 9999999; ++i)
可以输出1到7位数所有的armstrong

#15



#include <stdio.h>
#include <math.h>
#include <time.h>

bool isArmstrong(int n)
{
int a = 0, b=0, sum=0, tmp;

tmp = n;
for(;tmp>0;)

a=tmp%10;
tmp=tmp/10;
b++;
}

tmp = n;
for(;tmp>0;)

a=tmp%10;
sum=sum+(int)pow((double)a,(double)b);
tmp=tmp/10;
}

if(sum==n) return true;

return false;
}


int main(int argc, char* argv[])
{
clock_t start, finish;

    start = clock();
for(int i = 0; i <= 99999999; ++i)      // 求1到8位数的armstrong
{
if(isArmstrong(i)) printf("%d\n", i);
}
finish = clock();
    int interval = (finish - start) * 1000 / CLOCKS_PER_SEC;

printf("运算了%dms\n", interval);

return 0;
}
// 在Thinkpad T410i上的输出结果:
// 运算了78671ms


所以,前面有朋友出了一个求21位的armstrong的题目,要求在3分钟之内算完,实在是太有难度了。
当然用多线程分段计算可以提高计算速度,但要在3分钟之内,用常规的算法,几乎不太可能,除非在很多机器上同时计算。

#16


3位数的简单
#include <stdio.h>

int main (void) {
        int i;
        for(i=100;i<999;i++)
            if((i/100)*(i/100)*(i/100)+(i/10%10)*(i/10%10)*(i/10%10)+(i%10)*(i%10)*(i%10)==i)
            printf("%i\n",i);
        return 0;
}

#17


lz才开始的代码没有括号,前面算出的n被后面的n覆盖,所以只有一个值,括号这东西不好省

#18


引用 17 楼 ianoshen 的回复:
lz才开始的代码没有括号,前面算出的n被后面的n覆盖,所以只有一个值,括号这东西不好省

恩,是呢,谢谢!

#19


还行

注意一下边缘对象 和 逻辑关系就行了

#20


注意下括号.二楼是正确的!

#21



for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                n=100*a+10*b+c;
                if(a*a*a+b*b*b+c*c*c==n) printf("%d  \n",n);
            }

#22


for(a=1;a<9;a++)
for(b=0;b<9;b++)
for(c=0;c<9;c++)
{
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
  {
     n=100*a+10*b+c;
     printf("%d\n",n);
  }
}

楼主很粗心,漏掉了 两个括号。 

#23


不得不说你的编码风格很成问题。这个如果是笔试题的话,直接看编码风格就si啦

#24


lz这段代码和我大一的时候有得一拼。

#25


神马情况啊!!!这么一个小白问题居然上了首页???难道...

#26


水仙花数?

#27


该回复于2011-04-28 10:39:38被版主删除

#28


楼主是个女的,回答正确不??给我分,多少都行 请看下~~~一个三位数每个位上的数字立方之和等于这个数

#29


引用 28 楼 utopiaaaa 的回复:
楼主是个女的,回答正确不??给我分,多少都行

请看下~~~一个三位数每个位上的数字立方之和等于这个数我结贴很长时间了呀!

#30


为啥是void main()?
而且很多人都在用。
难道是写单片机程序?

#31


int cube[10];


main()
{
  for (i = 0; i< 10; i++)
  {
   cube[i] = i*i*i;
  }
  .....
}

bool isArmstrong(int n)
{
    ....
    //sum=sum+(int)pow((double)a,(double)b);
    sum=sum+cube(a);

引用 15 楼 pathuang68 的回复:
C/C++ code

#include <stdio.h>
#include <math.h>
#include <time.h>

bool isArmstrong(int n)
{
    int a = 0, b=0, sum=0, tmp;

    tmp = n;
    for(;tmp>0;)
    { 
        a=tmp%10;
    ……

#32


貌似这是大一时 C语言中的习题 求1000以内的水仙花数!额 

#33


这个我觉得用穷举法蛮简单的,发上来一起探讨咯~
        #include<stdio.h>
        #include<math.h>
        void main()
        {
  int a,b,c;
  for(int i=100;i<999;i++)
  {
a=i/100;
b=(i/10)%10;
c=i%10;
if(i==pow(a,3)+pow(b,3)+pow(c,3))
printf("%d\n",i);

  }
        }

#34


引用 23 楼 shanmao 的回复:
不得不说你的编码风格很成问题。这个如果是笔试题的话,直接看编码风格就si啦

请说详细点,谢谢~我和她写的差不多,我是新手,别喷。说出来,我也好改啊,谢谢

#35


因为a<10,所以a*a*a<100*a,所以b*b*b+c*c*c>10*b+c
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?

#36


能不能用另一种方法把这个算法写出来!

#37


我用EXCEL的规划求解可以算出来,不需要编程
等于371

#38


//一个三位数每个位上的数字立方之和等于这个数
static int GetConditionalNum(void)
{
int nCubeNumOfArray[10] =
{
0,   1,   8,   27,  64,
125, 216, 343, 512, 729
};

int nBitNum = 0;
int nTenNum = 0;
int nHundredNum = 0;
int nNum = 0;
int nResNum = 0;

printf("GetConditionalNum\n");
for(nHundredNum = 1; nHundredNum <= 9; nHundredNum++)
{
for(nTenNum = 0; nTenNum <= 9; nTenNum++)
{
for(nBitNum = 0; nBitNum <= 9; nBitNum++)
{
nNum = nCubeNumOfArray[nBitNum] + 
                                       nCubeNumOfArray[nTenNum] + n
                                       nCubeNumOfArray[nHundredNum];
nResNum = nBitNum + nTenNum*10 + nHundredNum*100;
if(nResNum == nNum)
{
printf("%d\n", nNum);
}
}
}
}

return true;
}

#39


#include <stdio.h>
#include <math.h>

void main()
{

  int a,b,c,n;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c){
  n=100*a+10*b+c;
printf("%d\n",n);
}
}

应该这样写吧,要不然只会显示最后一个水仙数,或者干脆这样写

#include <stdio.h>
#include <math.h>
void main()
{
  int a,b,c;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
Printf("%d\n",100*a+10*b+c);
}

#40


引用 39 楼 wqs12ec056 的回复:
#include <stdio.h>
#include <math.h>

void main()
{

  int a,b,c,n;
  printf("水仙数字");
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c){
  n=100*a……

恩,谢谢!!

#41


该回复于2011-05-04 16:31:36被版主删除

#42


这是水仙花的例子。

#43


有没有试过求个21位的 

#44


该回复于2011-05-05 09:24:14被版主删除

#45


该回复于2011-05-05 09:52:53被版主删除