的确求出最小公倍数那个数,但是那不是结果,那只是过程。
然后把这个数分解成所有不能被分解的数,这些数就是组合那些约束的东西了。
比如10。得到的是6
分解出来是1,2,3这3个。
然后看这3个数能组合成多少个因子,且在10以内,个数又要最多的,数字又要最小的。
这样就把范围划小多了/
循环次数有了大幅度的减少。
" target="_blank">[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
[此贴子已经被作者于2006-11-13 23:20:18编辑过]
我想了下,大概想出个思路,说出来,大家看下。
我接着上一楼的说
我们的问题是
A=2^n1 * 3^n2 * 5^n3 *......* y^k * x^(k+1)<=MAX 且A最小的情况下
求 B=(n1+1)(n2+1)(n3+1) …K*(K+1) 的值最大;
分析:
先令 a1=2^n1 * 3^n2 * 5^n3 *......* y^k * x^(m) b1=(n1+1)(n2+1)(n3+1) …k*m
a2=2^n1 * 3^n2 * 5^n3 *......* y^(k+r1) * x^(m-1) b2=(n1+1)(n2+1)(n3+1) …(k+r1)*(m-1)
a3=2^n1 * 3^n2 * 5^n3 *......* y^(k+r2) * x^(m-2) b3=(n1+1)(n2+1)(n3+1) …(k+r2)*(m-2)
a4=2^n1 * 3^n2 * 5^n3 *......* y^(k+r3) * x^(m-3) b4=(n1+1)(n2+1)(n3+1) …(k+r3)*(m-3)
注意a和b的最后两项。从a1到a4是慢慢变小的,我们用一个最大的质数约束换最多的第二大质数约数,以来使B1尽量大。而b1到b4看最后两项,大家想想,b1到b4是先变大后变小的,或者是直接变小的,不会先变大再变小再变大这样反复。
于是我们便可以用计算机从A的最大项质数约数开始向最小项质数约数扫描,碰到B增大的话就继续上述a1~a4过程,碰到B减小的话就将扫描指针往小的质数约数移。这样只要扫描到有一项B不再增大。便得出了我们要求的A。
先给出个例子:
比如我们求的是100以内的“超级合数”
令A=100=2^2 * 3^0 * 5^2 则约数个数 B=(2+1)*(0+1)*(2+1)=9
现在开始找超级合数
令A1=2^2 * 3^1 * 5^1 B1=(2+1)*(1+1)*(1+1)=12
(现在最大质数约数为5,第二最大约数为3)
(用最大的质数约束换最多的第二大质数约数,以来使B1尽量大,这里3<5<3^2)
令A2=2^2 * 3^2 * 5^0 B2=(2+1)*(2+1)*(0+1)=9<12
(停止这次扫描,将最大约数改为3,第二大约数改为2)
令A3=2^3 * 3^1 * 5^0 B2=(3+1)*(1+1)*(0+1)=8<12
(2<3<2^2)
(停止这次扫描,且整个扫描过程结束)
求超级合数过程结束。我们看到最大的B为B1=12,则A1即为所求。A1=2^2 * 3^1 * 5^1 =60
我的代码也没写出,整个过程我自己看是没什么问题。若有漏洞,希望大家指出
谢谢!
[此贴子已经被作者于2006-10-14 20:11:18编辑过]