也谈第1500个只有2、3、5质因子的自然数的计算

原创 2006年05月22日 21:43:00

好久不来CSDN,偶尔看到这个帖子:http://community.csdn.net/Expert/topic/4730/4730797.xml?temp=5.944461E-02,楼主说是微软的面试题。我第一次答错了,然后才领会到要点:这题适宜用动态规划算法来解。

 

下面的代码可能有点笨拙,但自以为清晰,暂且存起来。

#include <cstdlib>
#include <cstdio>

class Calc235
{
 unsigned *v;
 unsigned minV, va, vb, vc;
 int a,b,c;
 const int N;
 int min(unsigned a, unsigned b, unsigned c)
 {
  return (a<=b)?((a<=c)?a:c):((b<=c)?b:c);
 }
public:
 Calc235(int n)
 :N(n)
 {
  v = new unsigned[N];
 }
 ~Calc235()
 {
  delete[]v;
 }
 void execute()
 {
  v[0] = 1;
  a = b = c = 0;
  va = v[a] * 2;
  vb = v[b] * 3;
  vc = v[c] * 5;
  for (int i=1; i<N; ++i)
  {
   v[i] = min(va, vb, vc);
   if (va == v[i])
   {
    va = v[++a] * 2;
   }
   if (vb == v[i])
   {
    vb = v[++b] * 3;
   }
   if (vc == v[i])
   {
    vc = v[++c] * 5;
   }
  // printf("v[%i]=%10u v[%i]=%10u v[%i]=%10u v[%i]=%10u/n",
  //  i, v[i], a, v[a]*2, b, v[b]*3, c, v[c]*5);
  }
 }
 unsigned getResult()
 {
  return v[N-1];
 }
};

int main(int argc, char *argv[])
{
 int N = 1500;
 if (argc > 1)
 {
  N = atoi(argv[1]);
 }
 Calc235 calc(N);
 calc.execute();
 unsigned v = calc.getResult();
 printf("result = %u/n", v);
 return 0;
}

 计算结果:

命令“calc235 2000”的部分输出,这一部分显示,第1500个只有2、3、5质因子的自然数是859963392。

v[1498]= 854296875 v[1363]= 859963392 v[1287]= 859963392 v[1197]= 860934420
v[1499]= 859963392 v[1364]= 860934420 v[1288]= 860934420 v[1197]= 860934420
v[1500]= 860934420 v[1365]= 864000000 v[1289]= 864000000 v[1198]= 864000000
v[1501]= 864000000 v[1366]= 874800000 v[1290]= 874800000 v[1199]= 874800000

下面的部分输出显示,计算第1847个数时发生了溢出:

v[1829]=3955078125 v[1674]=3981312000 v[1589]=3981312000 v[1483]=3981312000
v[1830]=3981312000 v[1675]=3985807500 v[1590]=3985807500 v[1484]=3985807500
v[1831]=3985807500 v[1676]=4000000000 v[1591]=4026531840 v[1485]=4000000000
v[1832]=4000000000 v[1677]=4026531840 v[1591]=4026531840 v[1486]=4026531840
v[1833]=4026531840 v[1678]=4031078400 v[1592]=4031078400 v[1487]=4031078400
v[1834]=4031078400 v[1679]=4050000000 v[1593]=4050000000 v[1488]=4050000000
v[1835]=4050000000 v[1680]=4076863488 v[1594]=4076863488 v[1489]=4081466880
v[1836]=4076863488 v[1681]=4081466880 v[1595]=4081466880 v[1489]=4081466880
v[1837]=4081466880 v[1682]=4096000000 v[1596]=4100625000 v[1490]=4096000000
v[1838]=4096000000 v[1683]=4100625000 v[1596]=4100625000 v[1491]=4100625000
v[1839]=4100625000 v[1684]=4132485216 v[1597]=4132485216 v[1492]=4147200000
v[1840]=4132485216 v[1685]=4147200000 v[1598]=4147200000 v[1492]=4147200000
v[1841]=4147200000 v[1686]=4194304000 v[1599]=4199040000 v[1493]=4194304000
v[1842]=4194304000 v[1687]=4199040000 v[1599]=4199040000 v[1494]=4199040000
v[1843]=4199040000 v[1688]=4218750000 v[1600]=4218750000 v[1495]=4218750000
v[1844]=4218750000 v[1689]=4246732800 v[1601]=4246732800 v[1496]=4246732800
v[1845]=4246732800 v[1690]=4251528000 v[1602]=4251528000 v[1497]=4251528000
v[1846]=4251528000 v[1691]=         0 v[1603]=4271484375 v[1498]=4271484375
v[1847]=         0 v[1692]=   4849664 v[1603]=4271484375 v[1498]=4271484375
v[1848]=   4849664 v[1693]=   9704804 v[1603]=4271484375 v[1498]=4271484375
v[1849]=   9704804 v[1694]=  25032704 v[1603]=4271484375 v[1498]=4271484375
v[1850]=  25032704 v[1695]=  58597376 v[1603]=4271484375 v[1498]=4271484375
v[1851]=  58597376 v[1696]=  79032704 v[1603]=4271484375 v[1498]=4271484375
v[1852]=  79032704 v[1697]=  99563954 v[1603]=4271484375 v[1498]=4271484375
v[1853]=  99563954 v[1698]= 128712704 v[1603]=4271484375 v[1498]=4271484375
v[1854]= 128712704 v[1699]= 133707704 v[1603]=4271484375 v[1498]=4271484375
v[1855]= 133707704 v[1700]= 184008704 v[1603]=4271484375 v[1498]=4271484375

(hdu step 2.1.3)Largest prime factor(求一个数的最大质因子的位置)

题目:       Largest prime factorTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja...
  • caihongshijie6
  • caihongshijie6
  • 2015年01月30日 20:34
  • 1901

寻找质因子 UESTC - 982

读入一个自然数,将nn分解为质因子连乘的形式输出。 Input 有多组测试数据。输入的第一行是整数TT(0T≤100000),表示测试数据的组数。每一组测试数据只有一行,包含待分解的自然数nn。该行...
  • qq_36553623
  • qq_36553623
  • 2017年02月27日 23:32
  • 297

【codevs1246】丑数,STL与取模大质数的好处

丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 对于一给定的素数集合 S = {...
  • xym_CSDN
  • xym_CSDN
  • 2015年12月08日 20:11
  • 368

丑数(数论)

Description 丑数就是这个数的质因子只有2,3,5,7这四个,除此之外不再含有其它 别的质因子。 注意1也被认为是丑数.丑数的前20个为 1, 2, 3, 4, 5, 6, 7, 8...
  • u011292087
  • u011292087
  • 2014年01月10日 19:13
  • 611

读入一个自然数,将n分解为质因子连乘的形式输出(筛法)

为了提高速度,采用筛法来求质因子: #include #include #include #include using namespace std; int main () { in...
  • qsort_
  • qsort_
  • 2016年07月13日 21:21
  • 1121

求第1500个丑数

参考《剑指Offer》 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当...
  • Double2hao
  • Double2hao
  • 2016年12月14日 16:22
  • 1548

【HUSTOJ】1033: 质因子分解

1033: 质因子分解 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 189  Solved: 40 原题链接 ...
  • dearvee
  • dearvee
  • 2016年05月04日 23:18
  • 138

计算数自然数序列中的1和2

问题:     给定一个自然数N,计算1,2,3...N中,出现1和2的数量。比如1,2,3...10,一共出现了3次,1,2,3...12,一共出现了7次。   思路:     比如计算54...
  • oswin
  • oswin
  • 2014年10月22日 22:02
  • 794

算法学习笔记之寻找第1500个丑数

最近在阅读《算法新解》(刘新宇 著),书写得很不错,推荐程序们阅读。前言中有个例子,是寻找第1500个丑数,所谓丑数是指仅含2、3、5这三个素因子的自然数。作者在书中给出了伪代码。作为练习,记录下自己...
  • a_step_further
  • a_step_further
  • 2017年01月30日 21:03
  • 179

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。 求按从小到大的顺序的第N个丑数。...
  • A784586
  • A784586
  • 2017年02月28日 13:20
  • 2771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:也谈第1500个只有2、3、5质因子的自然数的计算
举报原因:
原因补充:

(最多只允许输入30个字)