我的高效率求水仙花数代码,欢迎参考。要提意见的请想好理由

chenhj_wo 2008-04-10 09:25:26
#include <stdio.h>

#define NUM_MAX (10)

void main(void)
{
int daffodil;
int bw_incr, sw_incr, gw_incr;
int numeric_cube[NUM_MAX] = {0, 1, 8, 27, 64, 125, 216, 343, 512, 729};
int n_hundred[NUM_MAX] = {0, 100, 200, 300, 400, 500, 600, 700, 800, 900};
int n_decade[NUM_MAX] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90};

printf ("There are daffodil numerics from 100 to 999:\n ");

for (bw_incr = 1; bw_incr < NUM_MAX; bw_incr++)
{
for (sw_incr = 0; sw_incr < NUM_MAX; sw_incr++)
{
for (gw_incr = 0; gw_incr < NUM_MAX; gw_incr++)
{
daffodil = numeric_cube[bw_incr] + numeric_cube[sw_incr] + numeric_cube[gw_incr];
if (daffodil == n_hundred[bw_incr] + n_decade[sw_incr] + gw_incr)
{
printf ("%d\n", daffodil);
}
}
}
}
}
...全文
137 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hazuki9902 2008-04-13
  • 打赏
  • 举报
回复
靠,if没全部贴过来??

    for (bw_incr = 1,daffodil = 100; bw_incr < NUM_MAX; bw_incr++)
{
for (sw_incr = 0; sw_incr < NUM_MAX; sw_incr++)
{
for (gw_incr = 0; gw_incr < NUM_MAX; gw_incr++)
{
if (daffodil == numeric_cube[bw_incr] + numeric_cube[sw_incr] + numeric_cube[gw_incr])
{
printf ("%d\n", daffodil);
}
daffodil++;
}
}
}
hazuki9902 2008-04-13
  • 打赏
  • 举报
回复
没分我还是要说的!

不论算法,就楼主的程序肯定还是可以优化的:

    for (bw_incr = 1; bw_incr < NUM_MAX; bw_incr++)
{
for (sw_incr = 0; sw_incr < NUM_MAX; sw_incr++)
{
for (gw_incr = 0; gw_incr < NUM_MAX; gw_incr++)
{
daffodil = numeric_cube[bw_incr] + numeric_cube[sw_incr] + numeric_cube[gw_incr];
if (daffodil == n_hundred[bw_incr] + n_decade[sw_incr] + gw_incr)
{
printf ("%d\n", daffodil);
}
}
}
}


其实可以改成:

    for (bw_incr = 1,daffodil = 100; bw_incr < NUM_MAX; bw_incr++)
{
for (sw_incr = 0; sw_incr < NUM_MAX; sw_incr++)
{
for (gw_incr = 0; gw_incr < NUM_MAX; gw_incr++)
{
if (daffodil == numeric_cube[bw_incr] + numeric_cube[sw_incr])
{
printf ("%d\n", daffodil);
}
daffodil++;
}
}
}


理由:
从反汇编来看:
改前是4个mov 2个add
改后是3个mov 1个add


mantix 2008-04-11
  • 打赏
  • 举报
回复
原理叶挺简单的,但是觉得这样还是不方便,如果说是4位数,5位数,或者更多位的话,lz就有得忙了,全部要列出来
感觉还是循环方便点
chenhj_wo 2008-04-10
  • 打赏
  • 举报
回复
先说明几点:
1.可能有但会觉得3层for循环不好,但有人一个for做的次数和我3层是一样的。
2.主要考虑是不做%和*,因为这两种运算符,机器指令周期很长。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧