找回密码
 欢迎注册
查看: 18554|回复: 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-5-2 01:55 , Processed in 0.044938 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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