找回密码
 欢迎注册
楼主: 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. int test(mpz_t pow, int p)
  5. {
  6. unsigned tmp;
  7. int d[10], i;
  8. char t[250];
  9. for (i = 0; i < 10; i ++) d[i] = 0;
  10. mpz_get_str(t, 10, pow);
  11. for (i = 0; i < strlen(t); i ++)
  12. d[t[i] - '0']++;
  13. for (i = 0; i < 10; i ++)
  14. if (d[i] != p)
  15. return 0;
  16. return 1;
  17. }
  18. int main(void)
  19. {
  20. int p, b, i = 0;
  21. mpz_t n, pow;
  22. char start[16];
  23. printf("输入方幂: ");
  24. scanf("%d", &p);
  25. printf("输入起始数字(最大16位): ");
  26. scanf("%s", start);
  27. mpz_init(pow);
  28. mpz_init(n);
  29. mpz_init(m);
  30. mpz_init(t6);
  31. mpz_set_ui(t6, 1000000);
  32. mpz_set_str(n, start, 10);
  33. b = 0;
  34. printf("\n");
  35. while (b == 0)
  36. {
  37. i ++;
  38. mpz_pow_ui(pow, n, p);
  39. if (test(pow, p) == 1)
  40. {
  41. gmp_printf("找到[%Zd, %Zd]\n", n, pow);
  42. b = 1;
  43. break;
  44. }
  45. mpz_add_ui(n, n, 1);
  46. if (i >= 10000000)
  47. {
  48. i = 0;
  49. gmp_printf("搜索到%Zd\n", n);
  50. }
  51. }
  52. mpz_clear(n);
  53. mpz_clear(pow);
  54. mpz_clear(m);
  55. mpz_clear(t6);
  56. return 0;
  57. }
复制代码
修改好了 不用预计算了 但这次时间达到了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. int test(mpz_t pow, int p)
  5. {
  6. unsigned tmp;
  7. int d[10], i;
  8. char t[250];
  9. for (i = 0; i < 10; i ++) d[i] = 0;
  10. mpz_get_str(t, 10, pow);
  11. for (i = 0; i < strlen(t); i ++)
  12. d[t[i] - '0']++;
  13. for (i = 0; i < 10; i ++)
  14. if (d[i] != p)
  15. return 0;
  16. return 1;
  17. }
  18. int main(void)
  19. {
  20. int p, b, i = 0;
  21. mpz_t n, pow, t10, tp;
  22. printf("输入方幂: ");
  23. scanf("%d", &p);
  24. mpz_init(pow);
  25. mpz_init(n);
  26. mpz_init(t10);
  27. mpz_init(tp);
  28. mpz_set_ui(t10, 1000000000);
  29. mpz_mul_ui(t10, t10, 10);
  30. mpz_set_ui(tp, 10);
  31. mpz_pow_ui(tp, tp, 10*p - 1);
  32. mpz_root(n, tp, p);
  33. mpz_add_ui(n, n, 1);
  34. b = 0;
  35. gmp_printf("初始数字:%Zd\n", n);
  36. while (mpz_cmp(n, t10) < 0)
  37. {
  38. mpz_pow_ui(pow, n, p);
  39. if (test(pow, p) == 1)
  40. gmp_printf("找到[%Zd, %Zd]\n", n, pow);
  41. mpz_add_ui(n, n, 1);
  42. }
  43. mpz_clear(n);
  44. mpz_clear(pow);
  45. mpz_clear(t10);
  46. mpz_clear(tp);
  47. return 0;
  48. }
复制代码
改成自动的了 只要输入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-12-22 09:58 , Processed in 0.032140 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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