| 
注册时间2009-5-22最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分38756在线时间 小时 
 | 
 
 发表于 2010-1-17 13:51:55
|
显示全部楼层 
| 本帖最后由 KeyTo9_Fans 于 2010-1-17 13:57 编辑 
代码如下: 优点:
实时更新数字和,不用每次都把9位数字累加一遍复制代码#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;
}
 缺点:
筛法比较慢,不如mathe写的筛法代码跑得快  运行时间:
筛法:60秒
枚举每一位数字并统计结果:6秒
处理统计数据并输出:忽略
总计:66秒
输出结果如下: ##########
优化方案:
枚举9位数从100000001开始,每次加2,比每次加1快2倍,使得:
筛法:60秒
枚举数字:3秒
总计:63秒
但枚举数字不是算法的瓶颈,改进筛法更重要。复制代码-----------
1: 45086079
2: 22543062
3: 0
4: 11275826
5: 9019962
6: 0
7: 6280065
8: 5694094
9: 0
-----------
 | 
评分
查看全部评分
 |