- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
发表于 2009-1-12 10:23:55
|
显示全部楼层
第一个版本
不过似乎有点慢-
- #include <stdio.h>
- #include <stdlib.h>
- #include <gmp.h>
-
- int digitNum[1000000][10];
- mpz_t m, t6;
-
- void init(void)
- {
- int i1, i2, i3, i4, i5, i6, n;
- for (i1 = 0; i1 <= 9; i1 ++)
- for (i2 = 0; i2 <= 9; i2 ++)
- for (i3 = 0; i3 <= 9; i3 ++)
- for (i4 = 0; i4 <= 9; i4 ++)
- for (i5 = 0; i5 <= 9; i5 ++)
- for (i6 = 0; i6 <= 9; i6 ++)
- {
- n = (i1 << 16 + i1 << 15 + i1 << 10 + i1 << 9 + i1 << 7 + i1 << 5);
- n += (i2 << 13 + i2 << 11 - i2 << 8 + i2 << 4);
- n += (i3 << 10 - i3 << 4 - i3 << 3);
- n += (i4 << 6 + i4 << 5 + i4 << 2) + (i5 << 3 + i5 << 1) + i6;
- digitNum[n][i1]++;
- digitNum[n][i2]++;
- digitNum[n][i3]++;
- digitNum[n][i4]++;
- digitNum[n][i5]++;
- digitNum[n][i6]++;
- }
- }
-
- int test(mpz_t pow, int p)
- {
- unsigned tmp, i;
- int d[10];
- for (i = 0; i < 10; i ++) d[i] = 0;
- while (mpz_cmp_ui(pow, 0) == 0)
- {
- mpz_divmod(pow, m, pow, t6);
- tmp = mpz_get_ui(m);
- for (i = 0; i < 10; i ++)
- d[i] += digitNum[tmp][i];
- }
-
- for (i = 0; i < 10; i ++)
- if (d[i] != p) return 0;
- return 1;
- }
- int main(void)
- {
- int p, b, i = 0;
- mpz_t n, pow;
- char start[16];
- 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);
- break;
- }
- mpz_add_ui(n, n, 1);
- if (i >= 100000000)
- {
- i = 0;
- gmp_printf("搜索到%Zd\n", n);
- }
- }
- mpz_clear(n);
- mpz_clear(pow);
- mpz_clear(m);
- mpz_clear(t6);
- return 0;
- }
复制代码 |
|