找回密码
 欢迎注册
查看: 31781|回复: 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-4-26 21:30 , Processed in 0.047170 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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