找回密码
 欢迎注册
查看: 54921|回复: 11

[讨论] 整数序列问题

[复制链接]
发表于 2008-6-26 17:16:21 | 显示全部楼层 |阅读模式

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

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

×
有整数序列$n_i$,长度为$k$ 如果对任何素数$p_j <= k$满足 按顺序从序列数出第$p_j$个数字$n_i$,如果长度不够, 则从序列首位置接着数,数到的整数移出序列 移出后,序列自动紧缩,循环处理直到序列为空 将移出序列的数字顺序写在一起,如果是素数,称为满足条件。 比如,有长度为10的序列,以位置表示: 则p = 2 2 4 6 8 10 3 7 1 5 9位置数字连在一起 p = 3 3 6 9 2 7 1 8 5 10 4位置数字连在一起 p = 5 5 10 6 2 9 8 1 4 7 3位置数字连在一起 p = 7 7 4 2 1 3 6 10 5 8 9位置数字连在一起 均是素数,则满足条件 现在求$k = 16$的对应的满足上述条件的一个序列的例子
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-6-27 12:53:38 | 显示全部楼层
我先限定序列中都是一位数(可以是0,但是0不能是任何整数第一个位置),那么k=16可以找到的部分解: 1110111101597989 1110111101976316 1110111104676694 1110111107733380 1110111109136435 1110111115232258 1110111117413084 ...
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-6-27 12:54:29 | 显示全部楼层
  1. #if 1
  2. #define _Test_HI
  3. #define integer CHugeInt
  4. #else
  5. #define _Test_HX
  6. #define integer CHugeIntX
  7. #endif
  8. #define K 16
  9. #define NP 6 //Total 6 primes less than K: 2,3,5,7,11,13
  10. int plist[NP]={2,3,5,7,11,13};
  11. int order[NP][K];
  12. int ntype[K];
  13. #define HEAD 1
  14. #define TAIL 2
  15. void init_order()
  16. {
  17. int orig[K];
  18. int i;
  19. for(i=0;i<NP;i++){
  20. int j;
  21. int c=0,s;
  22. for(j=0;j<K;j++)orig[j]=j;
  23. for(c=0,s=-1;c<K;c++){
  24. int d=0;
  25. for(d=0;d<plist[i];d++){
  26. s++;if(s>=K)s=0;
  27. while(orig[s]==-1){s++;if(s>=K)s=0;}
  28. }
  29. order[i][c]=orig[s];
  30. orig[s]=-1;
  31. }
  32. ntype[order[i][0]]|=HEAD;
  33. ntype[order[i][K-1]]|=TAIL;
  34. }
  35. }
  36. int tvalue[]={1,3,7,9};
  37. bool next_valid(int buf[K])
  38. {
  39. int i;
  40. for(i=K-1;i>=0;i--){
  41. if(buf[i]==9){
  42. buf[i]=0;
  43. }else{
  44. buf[i]++;
  45. break;
  46. }
  47. }
  48. if(i<0)return false;
  49. for(i=0;i<K;i++){
  50. if(ntype[i]&TAIL){
  51. if((buf[i]&1)==0){
  52. buf[i]++;
  53. }
  54. if(buf[i]==5)buf[i]=7;
  55. }else if(ntype[i]&HEAD){
  56. if(buf[i]==0){
  57. buf[i]=1;
  58. }
  59. }else{
  60. }
  61. }
  62. return true;
  63. }
  64. int main(int argc, char* argv[])
  65. {
  66. integer u;
  67. int c=0,i;
  68. int buf[K];
  69. init_order();
  70. for(c=0;c<K;c++)buf[c]=0;
  71. do{
  72. int j;
  73. if(!next_valid(buf))break;
  74. for(i=0;i<NP;i++){
  75. u=0;
  76. for(j=0;j<K;j++){
  77. u*=10;u+=buf[order[i][j]];
  78. }
  79. if(!u.IsPrime()){
  80. break;
  81. }
  82. }
  83. if(i==NP){
  84. for(c=0;c<K;c++){
  85. printf("%d",buf[c]);
  86. }
  87. printf("\n");
  88. }
  89. }while(1);
  90. return 0;
  91. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-6-27 12:57:39 | 显示全部楼层
在让程序将前两个序列对应所有素数给输出: 1110111101597989 1011199911581701 1109811591709111 1180511901971191 1917191011108159 5118799111100911 7111099085911111 1110111101976316 1011173611911601 1107111961603111 1110911601361171 1316161011101197 9111673111100611 6111076019311111
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-6-27 13:14:40 | 显示全部楼层
增加点难度?? 可以否? 要求序列每个整数都不同
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-6-27 13:17:35 | 显示全部楼层
应该还好,那就是需要使用两位数,复杂度可能会稍微提高一些,但是没有什么本质区别。 我觉得应该可以直接使用1~16去构造
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-6-27 13:23:01 | 显示全部楼层
不可能吧 需要打乱顺序吧 否则无法保证末尾是1,3,7,9
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-6-27 13:25:46 | 显示全部楼层
我的程序就是通过先判断哪几个数必须末尾是1,3,7,9来提高效率的。 唯一的区别就是这个程序写起来更加讨厌一些。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-6-27 13:51:38 | 显示全部楼层
你不强求是1--16就好了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-6-27 13:52:43 | 显示全部楼层
要不就干脆来更惊险的 1--n 从2到n均执行我说的操作 要求全素数 这个没解的概率大
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-12-4 17:06 , Processed in 0.035130 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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