- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
发表于 2009-3-3 10:58:44
|
显示全部楼层
-
- char pl[100000000];
- unsigned int pd[10000];
-
- unsigned int prodd(unsigned int n)
- {
- unsigned int r = 1;
- if (n < 10000) return pd[n];
- while (n >= 10000)
- {
- r *= pd[n % 10000];
- n /= 10000;
- }
- if (n != 0) r *= pd[n % 10000];
- return r;
- }
-
- void init(void)
- {
- unsigned int i, j, k, l, n;
-
- for (i = 0; i <= 9; i ++)
- for (j = 0; j <= 9; j ++)
- for (k = 0; k <= 9; k ++)
- for (l = 0; l <= 9; l ++)
- {
- if (i == 0)
- {
- if (j == 0)
- {
- if (k == 0)
- n = l;
- else
- n = k * l;
- }
- else n = j * k * l;
- }
- else n = i * j * k * l;
-
- pd[1000*i + 100*j + 10*k + l] = n;
- }
-
-
- for (i = 0; i <= 9; i ++)
- pl[i] = 0;
-
- for (i = 10; i < 100000000; i ++)
- {
- k = prodd(i);
- pl[i] = pl[k] + 1;
- }
- }
-
- int isprime(unsigned int n)
- {
- if (n % 2 == 0) return 0;
- if (n % 3 == 0) return 0;
- if (n % 5 == 0) return 0;
- if (n % 7 == 0) return 0;
- if (n % 11 == 0) return 0;
- if (n % 13 == 0) return 0;
- if (n % 17 == 0) return 0;
- if (n % 19 == 0) return 0;
- if (n % 23 == 0) return 0;
- if (n % 29 == 0) return 0;
- if (n % 31 == 0) return 0;
- return 1;
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- unsigned int i, k = 1, n, p;
- init();
- printf("init finished.\n");
-
- unsigned int max = 0;
- for (i = 0; i < 100000000; i ++)
- if (max < (unsigned int)pl[i]) max = (unsigned int)pl[i];
-
- printf("MAX Product of digits level: %u\n", max);
-
- for (i = 100000001; i <= 4099999999; i ++)
- {
- if (isprime(i))
- {
- n = prodd(i);
- p = 0;
- while (n >= 100000000)
- {
- p ++;
- n = prodd(n);
- }
-
- p += pl[n] + 1;
- if (p >= 10)
- printf("%u: %u\n", i, p);
- }
- k ++;
- if (k % 100000000 == 0)
- {
- printf("\n%u\n", k);
- }
- }
- return 0;
- }
复制代码 |
|