#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
运行结果是只有一个数吗?
#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
怎样显示所有的数呢?
#6
水仙数字153
370
371
407
Press any key to continue
输出了4个数~ 你那个for 有没有加{}?
#7
对的,就是代码风格不好。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。
#8
谢谢楼上各位!我会努力!
#9
加油!!
PS:多给点分。哈哈哈
PS:多给点分。哈哈哈
#10
你都不告诉我答案,不过你替我加油,会给你分啦!
#11
思路是对的,小问题有一些。
如果用pow(x, y)的话,代码会简单些。
如果用pow(x, y)的话,代码会简单些。
#12
太有意思了
#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
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
恩,是呢,谢谢!
#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);
}
}
楼主很粗心,漏掉了 两个括号。
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
#28
楼主是个女的,回答正确不??给我分,多少都行
#29
我结贴很长时间了呀!
#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);
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);
#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);
}
}
#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
请说详细点,谢谢~我和她写的差不多,我是新手,别喷。说出来,我也好改啊,谢谢
#35
因为a<10,所以a*a*a<100*a,所以b*b*b+c*c*c>10*b+c
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?
#36
能不能用另一种方法把这个算法写出来!
#37
我用EXCEL的规划求解可以算出来,不需要编程
等于371
等于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;
}
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);
}
#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
恩,谢谢!!
#41
#42
这是水仙花的例子。
#43
有没有试过求个21位的
#44
#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
运行结果是只有一个数吗?
#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
怎样显示所有的数呢?
#6
水仙数字153
370
371
407
Press any key to continue
输出了4个数~ 你那个for 有没有加{}?
#7
对的,就是代码风格不好。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。
基本原则是:把变化的部分分离。
比如:你的算法是求立方,那么立方就是变数。如果传入一个参数,可以求任意方就好了。
再比如:现在是3位数,如果你的程序是在某个范围内求就更好了。
那么,现在的3位数可以抽象为100到999。
满足了以上两点,更能体现C程序的特色。
#8
谢谢楼上各位!我会努力!
#9
加油!!
PS:多给点分。哈哈哈
PS:多给点分。哈哈哈
#10
你都不告诉我答案,不过你替我加油,会给你分啦!
#11
思路是对的,小问题有一些。
如果用pow(x, y)的话,代码会简单些。
如果用pow(x, y)的话,代码会简单些。
#12
太有意思了
#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
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
恩,是呢,谢谢!
#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);
}
}
楼主很粗心,漏掉了 两个括号。
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
#28
楼主是个女的,回答正确不??给我分,多少都行
#29
我结贴很长时间了呀!
#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);
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);
#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);
}
}
#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
请说详细点,谢谢~我和她写的差不多,我是新手,别喷。说出来,我也好改啊,谢谢
#35
因为a<10,所以a*a*a<100*a,所以b*b*b+c*c*c>10*b+c
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?
所以当c==0和c==1时,只要考虑b>=4的情况就可以了吧?
#36
能不能用另一种方法把这个算法写出来!
#37
我用EXCEL的规划求解可以算出来,不需要编程
等于371
等于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;
}
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);
}
#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
恩,谢谢!!
#41
#42
这是水仙花的例子。
#43
有没有试过求个21位的