大家好,欢迎来到IT知识分享网。
的士数
第二个的士数:
1729 = 111 + 121212
= 999 + 101010
第三个的士数:
= 167167167+ 436439439
= 228228228+ 423423423
= 255255255 + 414414414
。。。。。。。
暴力循环
—————————————————————————
代码:
/* 从键盘输入一个数字,找出所有小于 这个数字的所有的士数 */ #include<stdio.h> int main() {
int num; float key = 1.0; // 用来记录是第几个的士数 float flag; // 控制判断的士数 scanf("%d",&num); int time = 1; for(int i =2; i<num;i++) {
flag = key; for(int j = 1; j<i; j++) {
for( int n = 1; n< i; n++) // 2.0 16 {
if(i == j*j*j + n*n*n) //两个数字相同这样的话,程序只会记一次 {
//printf("hello");,这里是执行的 if(n == j) {
flag = flag - 1.0; // 控制变成零之后输出 9 //printf(" %f ",flag); } //printf(" %f ", flag); else // 没有设置是同一个数再相减 {
// 导致9的时候flag减了1,之后16的时候就可以输出了 flag = flag - 0.5; //printf(" _%d_%d_ ", j,n); } //printf(" %f ", flag); } if(flag == 0 ) {
if(time == 1) {
printf("%d", i); // 输出的士数 time = time + 1; //printf(" _%d_%d_ ", flag); } else {
printf(",%d", i); // 为了控制输出格式 } key = key +1.0; flag = key; // 满足找到key次之后才是的士数 //printf(" %f ", flag); } } } } return 0; }
改进
这样的循环实在是太长了,优化一下,从循环节的控制上面下手,也就是找到的两个数字其中一个数字的三次方大于原数的话都不会成立,那就从这里下手,控制循环是在1到 pow(i,1.0/3),这样的话可行。改一下就好了。
—————————————————————————
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119925.html