- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12787
- 在线时间
- 小时
|
发表于 2011-11-30 07:48:39
|
显示全部楼层
本楼给出所有源代码- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
-
- typedef unsigned __int64 UINT64;
- typedef unsigned long DWORD;
- typedef unsigned short WORD;
-
- WORD g_steps_tab[65536];
-
- int steps(DWORD n)
- {
- UINT64 x=n;
- int r=0;
- while ( x >1)
- {
- if ( x & 1) //x 是奇数
- {
- if ( x>=6148914691236517205I64)
- {
- printf("ERROR,n=%u,integer overflow, can not continue\n",n);
- return 0;
- }
- x=x*2+x+1;
- r++;
- }
- else
- {
- x=x /2;
- r++;
- }
- }
- return r;
- }
-
-
- //在计算过程中,当n的值小于65536,直接查表
- //tab[i] 表示 i+1 转化为1需要的步数
- int steps_pro(DWORD n,WORD tab[])
- {
- UINT64 x=n;
- int r=0;
-
- while ( x >1)
- {
- if ( x <=65536)
- {
- return r+tab[x-1];
- }
- else if ( x & 1) //x 是奇数
- {
- if ( x>=6148914691236517205I64)
- {
- printf("ERROR,n=%u,integer overflow, can not continue\n",n);
- return 0;
- }
- x=x*2+x+1;
- r++;
- }
- else
- {
- x=x /2;
- r++;
- }
- }
- return r;
- }
-
- void test2(DWORD to)
- {
- DWORD i,max_n;
- int r,max_r;
- max_r=0;
-
- DWORD t;
- t=GetTickCount();
- for (i=1;i<=65536;i++)
- {
- r=steps(i);
- g_steps_tab[i-1]=r;
- }
-
- max_r=0;
- for (i=1;i<=to;i++)
- {
- r=steps_pro(i,g_steps_tab);
- if (r>max_r)
- {
- max_r=r;
- max_n=i;
- }
- }
- t=GetTickCount()-t;
- printf("Calc up to %u, take %d ms\n",to,t);
- printf("steps[%d]=%d\n",max_n,max_r);
- }
-
-
- int main(int argc, char argv[])
- {
- test2(1000000);
- test2(10000000);
- test2(100000000);
- return 0;
- }
复制代码 |
评分
-
查看全部评分
|