gxqcn
发表于 2013-10-18 11:40:14
mathematica 发表于 2013-10-18 11:29
上面是我写的c++代码,结果和上面应该一样,一两秒钟就能搞定了,c++的效率挺高的!
相当不错!比到我们公司来面试的都好,至少结果是正确的。
请继续优化:比如不用除法指令、直接快速构造等,也许效率还可成千上百倍的提高!
mathematica
发表于 2013-10-18 11:46:51
没想到我自己居然还会点c++
mathematica
发表于 2013-10-18 12:05:44
#include <iostream>
int main()
{
int i={1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
int j={1, 3, 9, 27, 81};
int k={1, 5, 25, 125};
long ijk;
for (int ii=0;ii<=9;ii++)
{
for (int jj=0;jj<=4;jj++)
{
for (int kk=0;kk<=3;kk++)
{
ijk=i*j*k;
printf("%d\n",ijk);
}
}
}
}
不知道这个结果为什么和上面的不一样
mathematica
发表于 2013-10-18 17:56:52
Clear["Global`*"];(*Clear all variables*)
x=Table;
y=Table;
z=Table;
xyz=Tuples[{x,y,z}];
newxyz=(Sort@Map&,xyz])[](*小括号一定不能少*)
(*以上是方法一,下面的是方法二*)
(*下面的代码有可能是正确的*)
ab1=Divisors[]
(*下面的代码一定是正确的*)
ab2=Divisors[]
(*检查是否相等*)
最终的结果自己运行吧
mathematica
发表于 2013-10-18 17:57:53
对于mathematica是秒杀级别的
mathematica
发表于 2013-10-18 18:16:46
(*这个是有依据的代码,上面的20次方只不过是猜测的*)
k=12;ab1=Divisors[];
k=13;ab2=Divisors[];
k=14;ab3=Divisors[];
ab1-ab2(*如果不相等,则k需要增大*)
ab2-ab3(*如果相等,则证明k不需要增大*)
这个是秒杀级别的代码
mathematica
发表于 2013-10-18 18:19:36
ab2=Divisors[]
这个是mathematica的一行代码,而且绝对是正确的代码
mathematica
发表于 2013-10-18 18:44:11
对九楼提问的回答(*对9楼的回答*)
Clear["Global`*"];(*Clear all variables*)
rmax=Floor@Log;
smax=Floor@Log;
tmax=Floor@Log;
chengji0=0;
(*使用穷举法*)
Do[n=2^r*3^s*5^t;
ys=2^32-n;(*计算2^32比n大多少*)
chengji=(r+1)*(s+1)*(t+1);(*计算成绩*)
If[ys>=0&&chengji>chengji0,
chengji0=chengji;
out={r,s,t};
],
{r,0,rmax},
{s,0,smax},
{t,0,tmax}
];out (*输出最后的结果*)
KeyTo9_Fans
发表于 2013-10-21 10:47:34
设所求项数为$n$,任何一个整数只需$O(1)$的空间存储,任意两个整数做一次运算只需$O(1)$的时间,
那么用 三重循环 + 排序 的方法,时间复杂度是$O(n\log n)$,空间复杂度是$O(n)$,代码如下:#include<cstdio>
#include<algorithm>
using namespace std;
unsigned int max2,max3,max5,i,j,k,n,a;
int main()
{
max2=max3=max5=-1;
max2/=2;
max3/=3;
max5/=5;
for(i=1;;i*=2)
{
for(j=i;;j*=3)
{
for(k=j;;k*=5)
{
a=k;
if(k>max5)break;
}
if(j>max3)break;
}
if(i>max2)break;
}
sort(a,a+n);
for(i=0;i<200;i++)
printf(i%10>8?"%u\n":"%u ",a);
return 0;
}如果用 最小堆 实现一个 优先队列,那么时间复杂度不变,空间复杂度将降为$O(n^(2/3))$,代码略。
gxqcn
发表于 2013-10-21 11:31:02
无需排序,也无需任何除法运算,就能直接构造出来的。
请注意到一个事实:
除首项“1”外,在序列顺序增长的过程中,追加项(即新项)总可由现有序列中之前的某项,或乘2或乘3或乘5(可同时兼具多种途径)构造获得。
我们要做好的是:记录好现有待乘项(*2、*3、*5)的位置,并由此快速获得追加项的值。
用上述原理,可先人工模拟计算,得到其前几项:{ 1,2,3,4,5,6,8,9,10,12,15,16,... },
揣摩其规律,就可以得到比较快捷的算法。