找回密码
 欢迎注册
查看: 28345|回复: 12

[讨论] 所有九位素数中,各位数字的和能被2-9整除的各有多少个

[复制链接]
发表于 2010-1-16 08:18:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
所有九位素数中,各位数字的和能被2-9整除的各有多少个? 比如: 490450003各位数字的和能被5整除
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-16 11:16:57 | 显示全部楼层
为什么把3、6、9也考虑进来? 怎么可能被3、6、9整除? 不是只有2、4、5、7、8值得讨论吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-16 11:24:51 | 显示全部楼层
本帖最后由 wayne 于 2010-1-16 11:26 编辑 对,可以拿来讨论的只有 2,4,5,7,8
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-16 11:29:26 | 显示全部楼层
本帖最后由 wayne 于 2010-1-16 11:31 编辑 我想,题是这么问的 但宜分别讨论, 不同的数会有不同的快速算法 比如2,只需遍历所有素数,判断素数有偶数个奇数数字就是了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-16 12:31:27 | 显示全部楼层
呵呵,疏忽了.有朋友问,就直接贴上来了,就以5和8为例,有什么快速的计算方法.最初打算下载一个素数表的,查一下,九位素数个数为45086079个,放弃了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-16 21:12:35 | 显示全部楼层
穷举法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-17 09:26:56 | 显示全部楼层
4# wayne 判断素数有偶数个奇数数字, 判断奇数的个数也应该需要遍历每一位吧?这样速度也应该不会太快吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-17 11:45:31 | 显示全部楼层
现在只要个得数,我算了2小时也没算出来,谁给个答案?只要5 和8 的就行了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-17 13:51:55 | 显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-17 13:57 编辑 代码如下:
  1. #include<cstdio>
  2. unsigned int a[31250000],t[99],d[10],i9,i8,i7,i6,i5,i4,i3,i2,i1,i,j,s;
  3. int main()
  4. {
  5. for(i=2;i<31622;i++)
  6. if(!(a[i>>5]&(1<<(i&31)))) //a数组是把32个bit压成一个int
  7. for(j=i*i;j<1000000000;j+=i)a[j>>5]|=1<<(j&31); //在a数组中做筛法
  8. printf("-----------\n");
  9. s=1; //s变量表示每一位数字的和
  10. i=100000000; //i变量表示当前的9位数
  11. for(i9=1;i9<10;i9++,s++) //9重循环枚举每一位数,实时更新s变量
  12. for(s-=i8,i8=0;i8<10;i8++,s++)
  13. for(s-=i7,i7=0;i7<10;i7++,s++)
  14. for(s-=i6,i6=0;i6<10;i6++,s++)
  15. for(s-=i5,i5=0;i5<10;i5++,s++)
  16. for(s-=i4,i4=0;i4<10;i4++,s++)
  17. for(s-=i3,i3=0;i3<10;i3++,s++)
  18. for(s-=i2,i2=0;i2<10;i2++,s++)
  19. for(s-=i1,i1=0;i1<10;i1++,s++)
  20. {
  21. if(!(a[i>>5]&(1<<(i&31))))t[s]++; //把数字和为s的素数统计到t数组中
  22. i++;
  23. }
  24. for(i=0;i<99;i++)
  25. for(j=1;j<10;j++)
  26. if(i%j==0)d[j]+=t[i]; //把数字的和能被1到9整除的素数统计到d数组中
  27. for(i=1;i<10;i++)
  28. printf("%d: %d\n",i,d[i]);
  29. printf("-----------\n");
  30. return 0;
  31. }
复制代码
优点: 实时更新数字和,不用每次都把9位数字累加一遍 缺点: 筛法比较慢,不如mathe写的筛法代码跑得快 运行时间: 筛法:60秒 枚举每一位数字并统计结果:6秒 处理统计数据并输出:忽略 总计:66秒 输出结果如下:
  1. -----------
  2. 1: 45086079
  3. 2: 22543062
  4. 3: 0
  5. 4: 11275826
  6. 5: 9019962
  7. 6: 0
  8. 7: 6280065
  9. 8: 5694094
  10. 9: 0
  11. -----------
复制代码
########## 优化方案: 枚举9位数从100000001开始,每次加2,比每次加1快2倍,使得: 筛法:60秒 枚举数字:3秒 总计:63秒 但枚举数字不是算法的瓶颈,改进筛法更重要。

评分

参与人数 1金币 +2 贡献 +2 鲜花 +2 收起 理由
northwolves + 2 + 2 + 2

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-17 14:09:22 | 显示全部楼层
多谢了! 先筛出31622以下的素数P[] 再用P[]筛10亿以内的素数 for(j=P[i]*P[i];j<1000000000;j+=2*P[i])a[j>>5]|=1<<(j&31);
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 12:56 , Processed in 0.028349 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表