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

[讨论] 猜猜我的手机号码?

[复制链接]
发表于 2009-8-25 18:55:58 | 显示全部楼层
我用30楼代码 if( temp>189e8 && temp<190e8 )还是9秒,不知道什么时候限制1出现2次 medie2005 的最大时间耗费是什么,int64的mod /运算? 你的建议中最大缩短时间是靠什么? 〇〇 发表于 2009-8-25 15:55
最大缩短时间应该是在 31# 除了第 1 条以外的建议, 其中最后一条比较重要,因为它避免了除法指令。 我之所以第1条未采用,也是因为它将涉及到除法指令,并让程序出现过多跳转而繁杂。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-25 20:21:52 | 显示全部楼层
with tmp as (select -1+level*2 p from dual connect by level<=50) select a.p*b.p,a.p,b.p from tmp a,tmp b where a.p>=b.p and mod(a.p*b.p,100)=43; A.P*B.P P P ---------- ---------- ---------- 143 13 11 243 27 9 1443 39 37 943 41 23 43 43 1 343 49 7 1643 53 31 3843 63 61 1943 67 29 3243 69 47 2343 71 33 4543 77 59 1343 79 17 243 81 3 1743 83 21 7743 89 87 6643 91 73 4743 93 51 1843 97 19 5643 99 57 20 rows selected.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-25 20:45:03 | 显示全部楼层
我曾用 excel 表得到过上述数据,候选组合筛选比例为 40/2500 =1.6%,比较划算, 可惜需要除法运算(除法指令比较耗时),所以后来我就放弃用它了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 11:08:32 | 显示全部楼层
搜来的不依赖hugecalc的非递归全排列实现 #include #include //#include void output(int *p); //输出函数 void permutation(int *p);//全排列函数 int a[]={0,1,2,5,6,7};//待排列数组 int N=sizeof(a)/sizeof(int); //数组长度 int *p=a; //数组指针 void main() { output(p); permutation(p); //调用全排列函数 //output(p); //输出排列结果 //getch(); } void permutation(int *p) { bool flag=false; //标志排列是否结束 int temp; //临时变量,用来交换数组元素 while(1) { for(int i=0;i=p[i+1]); //找到第一个大于或等于倒序元素的数组元素 j-=1; temp=p[i+1]; //交换这两个元素 p[i+1]=p[j]; p[j]=temp; j=0; while(j<(i+1)/2) //倒置倒充元素原位置以前的所有元素 { temp=p[j]; p[j]=p[i-j]; p[i-j]=temp; j++; } break; //跳出for循环, } } if(flag) //如果排列完,结束循环 break; output(p); //输出排列结果 } } void output(int *p) { for(int i=0;i
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 11:23:35 | 显示全部楼层
hugecalc没有自带全排列算法.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 11:24:48 | 显示全部楼层
44# 〇〇 兄弟, 全排列调用的是STL里的标准模板,与 HugeCalc 完全无关。 我在 35# 中调用 HugeCalc, 仅仅是用到其高精度计时器,以及快速得到指定范围内的素数清单, 而这些不涉及大数算法的接口,HugeCalc 是不作任何限制的,即无须注册亦可免费调用。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 11:27:31 | 显示全部楼层
直接试除还是挺快的:
  1. #include <algorithm>
  2. using namespace std;
  3. using namespace LiDIA;
  4. #define HPRIME 1000
  5. int primelist[HPRIME*HPRIME];
  6. int pc;
  7. void initp()
  8. {
  9. int i,j;
  10. primelist[0]=primelist[1]=1;
  11. for(i=2;i<HPRIME;i++){
  12. if(!primelist[i]){//this is prime
  13. for(j=i*i;j<HPRIME*HPRIME;j+=i){
  14. primelist[j]=1;
  15. }
  16. }
  17. }
  18. for(i=2;i<HPRIME*HPRIME;i++){
  19. if(!primelist[i]){
  20. primelist[pc++]=i;
  21. }
  22. }
  23. }
  24. static int digitss[6]={0,1,2,5,6,7};
  25. void test(long long r)
  26. {
  27. int i;
  28. for(i=2;i<pc;i++){///skip prime 2 and 3
  29. if(primelist[i]>=100000)return;
  30. if(r%primelist[i]==0)break;
  31. }
  32. if(primelist[i]<10000)return;
  33. printf("%lld=%lld*%lld\n",r,primelist[i],r/primelist[i]);
  34. }
  35. int main()
  36. {
  37. int i,j;
  38. long long r=18900000000LL;
  39. initp();
  40. printf("Total %d primes found\n");
  41. do{
  42. for(i=0,j=0;j!=6;j++){
  43. i=i*10+digitss[j];
  44. }
  45. i=i*100+43;
  46. test(r+i);
  47. }while(next_permutation(digitss,digitss+6));
  48. }
复制代码
0.2秒
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 11:30:24 | 显示全部楼层
不知道现在大学里教不教 STL,因为我本人不是学这个专业的。 感觉 STL 是 C++ 的重要组成部分,应该好好应用。 可惜我周边的一些科班出身的对它反而并不怎么了解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 12:17:07 | 显示全部楼层
呵呵,OO只是一时糊涂而已. STL在现实软件中不知道应用如何.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 14:32:16 | 显示全部楼层
不知道现在大学里教不教 STL,因为我本人不是学这个专业的。 感觉 STL 是 C++ 的重要组成部分,应该好好应用。 可惜我周边的一些科班出身的对它反而并不怎么了解。 gxqcn 发表于 2009-8-26 11:30
是呀,接触了STL后才发现以前很多绞尽脑汁写的函数,STL中都有了,而且速度比我写的快的多。看国外的书一般都是推荐使用的,可以大大减少代码长度。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-21 20:55 , Processed in 0.023637 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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