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

[讨论] 数字乘积

[复制链接]
发表于 2009-2-26 11:28:58 | 显示全部楼层
主要是运行速度还是太慢了,毕竟在规模大起来的时候速度最重要
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 11:49:46 | 显示全部楼层

  1. // prod.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"

  4. char l[100000000];

  5. unsigned int prodd(unsigned int n)
  6. {
  7.         char c[17];
  8.         unsigned int i, k = 1;
  9.         sprintf(c, "%u", n);
  10.     for (i = 0; c[i] != 0; i ++)
  11.                 k *= (unsigned int)(c[i] - '0');
  12.     return k;
  13. }

  14. void init(void)
  15. {
  16.         unsigned int i, k, n;
  17.         for (i = 0; i <= 9; i ++)
  18.                 l[i] = 0;

  19.         for (i = 10; i < 100000000; i ++)
  20.         l[i] = l[prodd(i)] + 1;
  21.             
  22.         
  23. }       

  24. int isprime(unsigned int n)
  25. {
  26.         if (n & 1 == 0)
  27.                 return 0;
  28.         else
  29.                 if (n % 3 == 0)
  30.                         return 0;
  31.         if (n % 5 == 0) return 0;
  32.         if (n % 7 == 0) return 0;
  33.         if (n % 11 == 0) return 0;
  34.         if (n % 13 == 0) return 0;
  35.         if (n % 17 == 0) return 0;
  36.         if (n % 19 == 0) return 0;
  37.         if (n % 23 == 0) return 0;
  38.         if (n % 29 == 0) return 0;
  39.         if (n % 31 == 0) return 0;
  40.     return 1;
  41. }

  42. int _tmain(int argc, _TCHAR* argv[])
  43. {
  44.         unsigned int i;
  45.         init();
  46.         printf("init finished.\n");
  47.     for (i = 100000001; i <= 999999999; i ++)
  48.         {
  49.                 if (l[prodd(i)] == 9)
  50.                         if (isprime(i))
  51.                                 printf("%u  ", i);
  52.         }
  53.         return 0;
  54. }
复制代码
谁来优化下
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:05:08 | 显示全部楼层
有几点需要明确的是
假设反推
需要的数字
1、大于2位的就应该位数里不能有0了
2、只含有因子2,3,5,7, 如果大于99,则只含有因子2,3,7
3、任何级别的数字都不能大于该数字的位数,否则肯定不行
(和题目的要求相符)
4、数字分解得到的数字(反推)也应该符合这个规则

我觉得从级别2开始比较好
即25以上的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:10:54 | 显示全部楼层
这么考虑下来
27, 28, 36,45, 48, 54, 56, 63, 64, 72, 75, 84, 96是唯一的开始反推的数列
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:13:57 | 显示全部楼层
27 = 3 * 3 * 3
27 <- 39
27 <- 93
27 <- 333
27 <- 139
27 <- 193
27 <- 319
27 <- 913
27 <- 391
27 <- 931
不符合
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:14:46 | 显示全部楼层
同样的分析适合28
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:23:08 | 显示全部楼层
63 = 3 * 3 * 7
63 <- 79
63 <- 97
63 <- 337
63 <- 373
63 <- 733
63 <- 179
63 <- 197
63 <- 719
63 <- 917
63 <- 791
63 <- 971

均不符合
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:28:57 | 显示全部楼层
36 = 2 * 2 * 3 * 3
36 <- 49
36 <- 94
36 <- 263
36 <- 236
36 <- 229
36 <- 292
36 <- 343
36 <- 334
36 <- 326
36 <- 362
也不符合吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:34:37 | 显示全部楼层
谁能用程序分析下这几个数字
目前知道54是可以做逆推的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-26 13:35:43 | 显示全部楼层
另外,怀疑逆推时
不能有1

否则和题目要求不符

谁证明?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-19 22:05 , Processed in 0.043771 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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