- 注册时间
- 2009-5-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 38591
- 在线时间
- 小时
|
发表于 2010-1-17 13:51:55
|
显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-17 13:57 编辑
代码如下:- #include<cstdio>
-
- unsigned int a[31250000],t[99],d[10],i9,i8,i7,i6,i5,i4,i3,i2,i1,i,j,s;
-
- int main()
- {
- for(i=2;i<31622;i++)
- if(!(a[i>>5]&(1<<(i&31)))) //a数组是把32个bit压成一个int
- for(j=i*i;j<1000000000;j+=i)a[j>>5]|=1<<(j&31); //在a数组中做筛法
- printf("-----------\n");
- s=1; //s变量表示每一位数字的和
- i=100000000; //i变量表示当前的9位数
- for(i9=1;i9<10;i9++,s++) //9重循环枚举每一位数,实时更新s变量
- for(s-=i8,i8=0;i8<10;i8++,s++)
- for(s-=i7,i7=0;i7<10;i7++,s++)
- for(s-=i6,i6=0;i6<10;i6++,s++)
- for(s-=i5,i5=0;i5<10;i5++,s++)
- for(s-=i4,i4=0;i4<10;i4++,s++)
- for(s-=i3,i3=0;i3<10;i3++,s++)
- for(s-=i2,i2=0;i2<10;i2++,s++)
- for(s-=i1,i1=0;i1<10;i1++,s++)
- {
- if(!(a[i>>5]&(1<<(i&31))))t[s]++; //把数字和为s的素数统计到t数组中
- i++;
- }
- for(i=0;i<99;i++)
- for(j=1;j<10;j++)
- if(i%j==0)d[j]+=t[i]; //把数字的和能被1到9整除的素数统计到d数组中
- for(i=1;i<10;i++)
- printf("%d: %d\n",i,d[i]);
- printf("-----------\n");
- return 0;
- }
复制代码 优点:
实时更新数字和,不用每次都把9位数字累加一遍
缺点:
筛法比较慢,不如mathe写的筛法代码跑得快
运行时间:
筛法:60秒
枚举每一位数字并统计结果:6秒
处理统计数据并输出:忽略
总计:66秒
输出结果如下:- -----------
- 1: 45086079
- 2: 22543062
- 3: 0
- 4: 11275826
- 5: 9019962
- 6: 0
- 7: 6280065
- 8: 5694094
- 9: 0
- -----------
复制代码 ##########
优化方案:
枚举9位数从100000001开始,每次加2,比每次加1快2倍,使得:
筛法:60秒
枚举数字:3秒
总计:63秒
但枚举数字不是算法的瓶颈,改进筛法更重要。 |
评分
-
查看全部评分
|