找回密码
 欢迎注册
楼主: northwolves

[擂台] Ten digit numbers

[复制链接]
发表于 2009-1-12 14:30:47 | 显示全部楼层
不行的
haskell比他们都快
也简单
但都不如C/C++
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 14:42:00 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gmp.h>
  4.    
  5. int test(mpz_t pow, int p)
  6. {
  7.   unsigned tmp;
  8.   int d[10], i;
  9.   char t[250];
  10.   for (i = 0; i < 10; i ++) d[i] = 0;

  11.   mpz_get_str(t, 10, pow);
  12.   for (i = 0; i < strlen(t); i ++)
  13.       d[t[i] - '0']++;
  14.   for (i = 0; i < 10; i ++)
  15.       if (d[i] != p)
  16.         return 0;
  17.       
  18.   return 1;
  19. }
  20. int main(void)
  21. {
  22.   int p, b, i = 0;
  23.   mpz_t n, pow;
  24.   char start[16];
  25.   printf("输入方幂: ");
  26.   scanf("%d", &p);
  27.   printf("输入起始数字(最大16位): ");
  28.   scanf("%s", start);
  29.   mpz_init(pow);
  30.   mpz_init(n);
  31.   mpz_init(m);
  32.   mpz_init(t6);
  33.   mpz_set_ui(t6, 1000000);
  34.   mpz_set_str(n, start, 10);
  35.   b = 0;
  36.   printf("\n");
  37.   while (b == 0)
  38.   {
  39.     i ++;  
  40.     mpz_pow_ui(pow, n, p);
  41.     if (test(pow, p) == 1)
  42.     {
  43.       gmp_printf("找到[%Zd, %Zd]\n", n, pow);
  44.       b = 1;
  45.       break;
  46.     }
  47.     mpz_add_ui(n, n, 1);
  48.     if (i >= 10000000)
  49.     {
  50.       i = 0;
  51.       gmp_printf("搜索到%Zd\n", n);
  52.     }
  53.   }
  54.   mpz_clear(n);
  55.   mpz_clear(pow);
  56.   mpz_clear(m);
  57.   mpz_clear(t6);
  58.   return 0;
  59. }
复制代码
修改好了
不用预计算了
但这次时间达到了500秒
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 15:35:24 | 显示全部楼层
19的已经搜索到97
估计也是就1个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:02:49 | 显示全部楼层
从8858667905到9873773268
只有一个
已经搜索完
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:11:59 | 显示全部楼层
19的确只有一个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:22:26 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gmp.h>
  4.    
  5. int test(mpz_t pow, int p)
  6. {
  7.   unsigned tmp;
  8.   int d[10], i;
  9.   char t[250];
  10.   for (i = 0; i < 10; i ++) d[i] = 0;

  11.   mpz_get_str(t, 10, pow);
  12.   for (i = 0; i < strlen(t); i ++)
  13.       d[t[i] - '0']++;
  14.   for (i = 0; i < 10; i ++)
  15.       if (d[i] != p)
  16.         return 0;
  17.       
  18.   return 1;
  19. }
  20. int main(void)
  21. {
  22.   int p, b, i = 0;
  23.   mpz_t n, pow, t10, tp;
  24.   printf("输入方幂: ");
  25.   scanf("%d", &p);
  26.   mpz_init(pow);
  27.   mpz_init(n);
  28.   mpz_init(t10);
  29.   mpz_init(tp);
  30.   mpz_set_ui(t10, 1000000000);
  31.   mpz_mul_ui(t10, t10, 10);
  32.   mpz_set_ui(tp, 10);
  33.   mpz_pow_ui(tp, tp, 10*p - 1);
  34.   mpz_root(n, tp, p);
  35.   mpz_add_ui(n, n, 1);
  36.   b = 0;
  37.   gmp_printf("初始数字:%Zd\n", n);
  38.   while (mpz_cmp(n, t10) < 0)
  39.   {
  40.     mpz_pow_ui(pow, n, p);
  41.     if (test(pow, p) == 1)
  42.       gmp_printf("找到[%Zd, %Zd]\n", n, pow);

  43.     mpz_add_ui(n, n, 1);
  44.   }
  45.   mpz_clear(n);
  46.   mpz_clear(pow);
  47.   mpz_clear(t10);
  48.   mpz_clear(tp);
  49.   return 0;
  50. }
复制代码
改成自动的了
只要输入20就能得到所有20次方的恰好有20个0123456789结果

附上程序,没有限制幂的大小
5300多秒扫描一个方幂

pn.rar (53.79 KB, 下载次数: 4)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:29:26 | 显示全部楼层
输入方幂: 20
初始数字:8912509382
找到[8951993472, 109243381929665290144735387253484896485512153800629962749796403476740675298520463741968915306665585481026029884
06317917558817958274385371306360838853525309513410701102261427360428701722029347911499776]
20的找到一个最小的
经过Haskell核验, 是正确的

评分

参与人数 1威望 +2 鲜花 +2 收起 理由
northwolves + 2 + 2 Excellent!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:33:50 | 显示全部楼层
同时启动了20, 21
在考虑是否再启动几个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:37:59 | 显示全部楼层
服务器上启动了22, 23
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-12 16:53:26 | 显示全部楼层
除非停电
明天给出20-23的结果
别人就不要测试20-23了
要测试的
下载我给出的可执行程序
算24以后的

明天写带日志文件的
一口气挂几个连续的幂出来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-26 19:02 , Processed in 0.071601 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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