无心人 发表于 2009-1-12 14:30:47

不行的
haskell比他们都快
也简单
但都不如C/C++

无心人 发表于 2009-1-12 14:42:00


#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
   
int test(mpz_t pow, int p)
{
unsigned tmp;
int d, i;
char t;
for (i = 0; i < 10; i ++) d = 0;

mpz_get_str(t, 10, pow);
for (i = 0; i < strlen(t); i ++)
      d - '0']++;
for (i = 0; i < 10; i ++)
      if (d != p)
      return 0;
      
return 1;
}
int main(void)
{
int p, b, i = 0;
mpz_t n, pow;
char start;
printf("输入方幂: ");
scanf("%d", &p);
printf("输入起始数字(最大16位): ");
scanf("%s", start);
mpz_init(pow);
mpz_init(n);
mpz_init(m);
mpz_init(t6);
mpz_set_ui(t6, 1000000);
mpz_set_str(n, start, 10);
b = 0;
printf("\n");
while (b == 0)
{
    i ++;
    mpz_pow_ui(pow, n, p);
    if (test(pow, p) == 1)
    {
      gmp_printf("找到[%Zd, %Zd]\n", n, pow);
      b = 1;
      break;
    }
    mpz_add_ui(n, n, 1);
    if (i >= 10000000)
    {
      i = 0;
      gmp_printf("搜索到%Zd\n", n);
    }
}
mpz_clear(n);
mpz_clear(pow);
mpz_clear(m);
mpz_clear(t6);
return 0;
}
修改好了
不用预计算了
但这次时间达到了500秒

无心人 发表于 2009-1-12 15:35:24

19的已经搜索到97
估计也是就1个

无心人 发表于 2009-1-12 16:02:49

从8858667905到9873773268
只有一个
已经搜索完

mathe 发表于 2009-1-12 16:11:59

19的确只有一个

无心人 发表于 2009-1-12 16:22:26


#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
   
int test(mpz_t pow, int p)
{
unsigned tmp;
int d, i;
char t;
for (i = 0; i < 10; i ++) d = 0;

mpz_get_str(t, 10, pow);
for (i = 0; i < strlen(t); i ++)
      d - '0']++;
for (i = 0; i < 10; i ++)
      if (d != p)
      return 0;
      
return 1;
}
int main(void)
{
int p, b, i = 0;
mpz_t n, pow, t10, tp;
printf("输入方幂: ");
scanf("%d", &p);
mpz_init(pow);
mpz_init(n);
mpz_init(t10);
mpz_init(tp);
mpz_set_ui(t10, 1000000000);
mpz_mul_ui(t10, t10, 10);
mpz_set_ui(tp, 10);
mpz_pow_ui(tp, tp, 10*p - 1);
mpz_root(n, tp, p);
mpz_add_ui(n, n, 1);
b = 0;
gmp_printf("初始数字:%Zd\n", n);
while (mpz_cmp(n, t10) < 0)
{
    mpz_pow_ui(pow, n, p);
    if (test(pow, p) == 1)
      gmp_printf("找到[%Zd, %Zd]\n", n, pow);

    mpz_add_ui(n, n, 1);
}
mpz_clear(n);
mpz_clear(pow);
mpz_clear(t10);
mpz_clear(tp);
return 0;
}
改成自动的了
只要输入20就能得到所有20次方的恰好有20个0123456789结果

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

无心人 发表于 2009-1-12 16:29:26

输入方幂: 20
初始数字:8912509382
找到[8951993472, 109243381929665290144735387253484896485512153800629962749796403476740675298520463741968915306665585481026029884
06317917558817958274385371306360838853525309513410701102261427360428701722029347911499776]
20的找到一个最小的
经过Haskell核验, 是正确的

无心人 发表于 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以后的

明天写带日志文件的
一口气挂几个连续的幂出来
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: Ten digit numbers