水仙花数的问题

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

水仙花数的问题

1楼

有个练习 是打印所有水仙花数 就是一个3位数其各位数字立方和等于该数 如153=1*1*1+5*5*5+3*3*3。
我编的这个是不是太罗嗦了? 大家看看好么?指点一下
main()
{int shu,bai,shi,ge,ping;
  shu=100;
  while(shu<=999)
   {bai=shu/100;
   shi=(shu-bai*100)/10;
   ge=shu-bai*100-shi*10;
   ping=bai*bai*bai+shi*shi*shi+ge*ge*ge;
  if(shu==ping)
  printf("%d\n",shu);
  shu=shu++; 
 }
}
还有啊,平时看的一些练习题 不知道从哪里入手,只是一步一步写的,改改写写,一上午才做了一道题。郁闷 请高手指点一下平时遇到的练习题,怎么入手啊,说说经验好么?

202.116.24.*

2楼

还可以啊.
#include <stdio.h>
int main()
{
int shu,bai,shi,ge;
 for (shu=100;shu<1000;shu++)
 {
 bai=shu/100;
 shi=(shu-bai*100)/10;
 ge=shu-bai*100-shi*10;
 if(shu==(bai*bai*bai+shi*shi*shi+ge*ge*ge))
 printf("%d\n",shu);
 }
}

3楼

main()
{
int a,b,c,d;
for(a=100;a<=99;a++)
b=a/100;
c=a/10-b*10;
d=a-b*100-c*10;
if(b*b*b+c*c*c+d*d*d==a) printf("%d",a);
}

4楼

吾认为用三个for而不作除法可能更快点
main(){
int a,b,c,num;
for(a=1;a<10;a++){
for(b=0;b<10;b++){
for(c=0;c<10;c++){
if(a*100+b*10+c==(num=a*a*a+b*b*b+c*c*c))
printf("%d",num);
}
}
}
}

5楼

哎 都是高手 写的一个比一个精练。
221.13.130.*

6楼

第四个好.

7楼

反着求有创意

8楼

4楼的经典!!!

9楼

有创意~~

10楼

那个循环真是用的好,有创意~~~~~~~!!!
220.173.149.*

11楼

要是我早点看到就好了,我以前就不用那么辛苦写我的那道作业了.....
四楼的真的很好...

218.61.14.*

12楼

kao 垃圾 刚学 C的时候 就能写出来 垃圾 用STRUCT 写
202.196.242.*

13楼

http://t2.baidu.com/it/u=1272167552,3117854482&gp=1.jpg
202.196.242.*

14楼

可以
220.175.126.*

15楼

四楼的啊!请问你写的是很精简啊!但是不是你的效率会不高啊!编程还应该考虑效率吧!个人愚见啊!望多多指教啊!!

16楼

还有谁有算法的贴上来,有意思

17楼

我的对不
main()
{int m,i,b,a[4];
for(b=m,m=100;m<=1000;m++)
 for (i=1;i<=3;i++)
 {a[i]=(m%10)*(m%10)*(m%10);m=m/10;}
 if (b==a[1]+a[2]+a[3]) printf("%d",b);
 }

18楼

错了,是这样吗
main()
{int m,i,a[4];
for(m=100;m<=1000;m++)
{
for (i=1;i<=3;i++)
 {a[i]=(m%10)*(m%10)*(m%10);m=m/10;}
 if (m==a[1]+a[2]+a[3]) 
printf("%d",m);}
 }

19楼

个人认为,对于水仙花数这个问题,不用考虑编程效率,因为要遍历的范围太小,除非你还用8086,否则程序的执行完成时间都应当在秒以内.
其实上面这几段程序,只分两种:四楼方法与其它方法.
我对四楼太崇拜了,我认为他的方法是最好的. 表面上他的循环语句最多, 其实主要语句的执行次数一次也不多,都是九百次.
为了对四楼表示敬意,我用了一个小时的时间思考,把他的程序运行时间缩短了一半,也就是0.05秒.
#include<iostream.h>
main()
{
 int a,b,c,num;
 for(a=1;a<10;a++)
 {
 for(b=0;b<10;b++)
 {
 for(c=0;c<10;c++)
 {
 if(a+b+c<6) continue;
 if(a+b+c>16) continue;
 if(a*100+b*10+c==(num=a*a*a+b*b*b+c*c*c))
 //printf("%d\n",num);
 cout<<num<<endl;
 }
 }
 }
}

20楼

要变态,就变态到底!我这算法可是有数学根据的!
#include<stdio.h>
main()
{
 int a=1,b=0,c=0,num;
 for(a=1;a<10;a++)
 {
 for(b=0;b<10;b++)
 { if(a+b>=16) continue;
 for(c=0;c<10;c++)
 {
 if((num=a+b+c)<=6) continue;
 if(num>=16) continue;
 if(a*100+b*10+c==(num=a*a*a+b*b*b+c*c*c))
 printf("%d\n",num);
 }
 }
 }
}

21楼

/*我也来狂一把,假设楼上的结果是正确的,那么提速的唯一方法就是展开内循环了,虽然代码长一点~~~~~~
*/
#include<stdio.h>
main(){
 int a=1,b=0,num;
 for(a=1;a<10;a++){
 for(b=0;b<10;b++){
 if(a+b>=16) continue;

 if((num=a+b)<=6) goto next0;
 if(num>=16) goto next0;
 if(a*100+b*10==(num=a*a*a+b*b*b))
 printf("%d\n",num);

next0:
 if((num=a+b+1)<=6) goto next1;
 if(num>=16) goto next1;
 if(a*100+b*10+1==(num=a*a*a+b*b*b+1))
 printf("%d\n",num);

next1:
 if((num=a+b+2)<=6) goto next2;
 if(num>=16) goto next2;
 if(a*100+b*10+2==(num=a*a*a+b*b*b+8))
 printf("%d\n",num);

next2:
 if((num=a+b+3)<=6) goto next3;
 if(num>=16) goto next3;
 if(a*100+b*10+3==(num=a*a*a+b*b*b+27))
 printf("%d\n",num);

next3:
if((num=a+b+4)<=6) goto next4;
 if(num>=16) goto next4;
 if(a*100+b*10+4==(num=a*a*a+b*b*b+64))
 printf("%d\n",num);

next4:
if((num=a+b+5)<=6) goto next5;
 if(num>=16) goto next5;
 if(a*100+b*10+5==(num=a*a*a+b*b*b+125))
 printf("%d\n",num);

next5:
if((num=a+b+6)<=6) goto next6;
 if(num>=16) goto next6;
 if(a*100+b*10+6==(num=a*a*a+b*b*b+216))
 printf("%d\n",num);

next6:
if((num=a+b+7)<=6) goto next7;
 if(num>=16) goto next7;
 if(a*100+b*10+7==(num=a*a*a+b*b*b+343))
 printf("%d\n",num);

next7:
if((num=a+b+8)<=6) goto next8;
 if(num>=16) goto next8;
 if(a*100+b*10+8==(num=a*a*a+b*b*b+512))
 printf("%d\n",num);

next8:
if((num=a+b+9)<=6) continue;
 if(num>=16) continue;
 if(a*100+b*10+9==(num=a*a*a+b*b*b+729))
 printf("%d\n",num);
 }
 }
}

这样节省的时间有:
每次做循环所用的test指令和inc 指令,而goto实质上与continue差不多
另外少了算C*C*C这个~~~~

22楼

无效昵称 , 你太COOL了。我也再狂一把:
#include<stdio.h>
main(){
 int a=1,b=0,num;
 for(a=1;a<10;a++){
 for(b=0;b<10;b++){
 if(a+b>=16) continue;

 int lv,rv;
 lv=a*100+b*10;
 rv=a*a*a+b*b*b;
 if(lv+10<rv) continue;
 num=lv-rv;
 switch (num)
 {
 case 0: printf("%d\n%d\n",lv,lv+1);break;
 case 6: printf("%d\n",lv+2);break;
 case 24: printf("%d\n",lv+3);break;
 case 60: printf("%d\n",lv+4);break;
 case 120: printf("%d\n",lv+5);break;
 case 210: printf("%d\n",lv+6);break;
 case 336: printf("%d\n",lv+7);break;
 case 504: printf("%d\n",lv+8);break;
 case 720: printf("%d\n",lv+9);break;
 }
 }
 }
}

220.170.14.*

23楼

无效昵称 
C里面是不主张用goto语句的,能不用尽量不用

24楼

起得早还是睡得晚?
219.148.48.*

25楼

main()
{
int a,b,c,i;
for (i=100;i<1000;i++)
 {a=i/100;b=(i%100)/10;c=i%10;
 if( a*a*a+b*b*b+c*c*c==i)
 printf("%d",i);}
}

221.235.61.*

26楼


221.235.61.*

27楼

我看看你们编的都不错呀,,,小的我也来一个,

#include<stdio.h>
main()
{int i,j,k,p;
p=i*100+j*10+k;
printf("\n");
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)

if(p==i*i*i+j*j*j+k*k*k)
printf("%d",p);
getch();}

219.134.160.*

28楼

回复23楼,其实用熟练了goto是最好用的,尤其在多层嵌套时更是得心应手,想跳哪就跳哪,那感觉爽透了。“C里面是不主张用goto语句的”可能是上学时老师教的吧,他怕你出错!!你还信他的

29楼

我自己写的 大家有什么意见
main()
{
 int i,j,k,m;
 for(m=100;m<1000;m++)
 {
 i=m/100;
 j=(m%100)/10;
 k=m%100%10;
 if(m==i*i*i+j*j*j+k*k*k)
 printf("%d*%d*%d+%d*%d*%d+%d*%d*%d=%d\n",i,i,i,j,j,j,k,k,k,m);
 }
}

222.208.187.*

30楼

各位GGJJ,小妹有一问题请教
如果将水仙花数扩展,有一个n位数,它的各位数字的n次方和等于它本身,应该怎样写这个程序呢?

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈