找回密码
 欢迎注册
楼主: 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 <stdio.h>
#include <conio.h>
//#include <windows.h>

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<N-1;i++)
{
flag=true; //如已排列完,falg为真

if(p[i]<p[i+1]) //如果发现第一个倒序的数组元素,p[i+1]被称为倒序元素
{
flag=false; //说明未排列完

int j=0;
while(p[j++]>=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<N;i++)
printf("%2d",p[i]);
printf("\n");

}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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-4-19 09:33 , Processed in 0.054166 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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