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

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

[复制链接]
发表于 2009-8-26 14:33:45 | 显示全部楼层
直接试除还是挺快的:
#include
using namespace std;
using namespace LiDIA;

#define HPRIME 1000
int primelist[HPRIME*HPRIME];
int pc;
void initp()
{
        int i,j;
        primelist[0]=primelist[1]=1;
...
mathe 发表于 2009-8-26 11:27

mathe的using namespace LiDIA;
程序中使用了 LiDIA的什么?怎么没看出来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-26 14:37:31 | 显示全部楼层
可以把那行去掉。
因为 mathe 曾用 LiDIA 进行因数分解,改变算法后忘了去掉它了。

另外,我用 VS2008 编译 47# 的代码,需要将第 36 行代码由
  1. printf("%lld=%lld*%lld\n",r,primelist[i],r/primelist[i]);
复制代码
改成
  1. printf("%lld=%d*%d\n",r,primelist[i],r/primelist[i]);
复制代码
才能正确输出。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-27 00:38:21 | 显示全部楼层
52# gxqcn
原来如此。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-27 08:44:11 | 显示全部楼层
本帖最后由 〇〇 于 2009-8-27 08:51 编辑

47# mathe
我用你的算法改写的vc版本,怎么出来252个结果?

  1. #include <stdio.h>
  2. #include <conio.h>
  3. //#include <windows.h>
  4. #include "2M.txt"
  5. void output(int *p); //输出函数
  6. void permutation(int *p);//全排列函数
  7. void test(__int64 r);

  8. int a[]={0,1,2,5,6,7};//待排列数组
  9. int N=sizeof(a)/sizeof(int); //数组长度
  10. int *p=a; //数组指针
  11. int n=0;
  12. int m[720];
  13. void test(__int64 r)

  14. {

  15.         int i;

  16.         for(i=0;i<141800;i++){///skip prime 2 and 3

  17.                 if(prime[i]>=1900000)return;

  18.                 if(r%prime[i]==0)break;

  19.         }

  20.         if(prime[i]<10000)return;

  21.         printf("%I64d=%d*%d\n",r,prime[i],r/prime[i]);

  22. }


  23. void main()
  24. {
  25. output(p);
  26. permutation(p); //调用全排列函数
  27. __int64 r=189e8;
  28. for(int i=0;i<720;i++)
  29. test(r+m[i]*100+43);

  30. //output(p); //输出排列结果
  31. //getch();
  32. }

  33. void permutation(int *p)
  34. {
  35. bool flag=false; //标志排列是否结束
  36. int temp; //临时变量,用来交换数组元素

  37. while(1)
  38. {
  39. for(int i=0;i<N-1;i++)
  40. {
  41. flag=true; //如已排列完,falg为真

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

  45. int j=0;
  46. while(p[j++]>=p[i+1]); //找到第一个大于或等于倒序元素的数组元素
  47. j-=1;

  48. temp=p[i+1]; //交换这两个元素
  49. p[i+1]=p[j];
  50. p[j]=temp;

  51. j=0;
  52. while(j<(i+1)/2) //倒置倒充元素原位置以前的所有元素
  53. {
  54. temp=p[j];
  55. p[j]=p[i-j];
  56. p[i-j]=temp;

  57. j++;
  58. }
  59. break; //跳出for循环,
  60. }
  61. }
  62. if(flag) //如果排列完,结束循环
  63. break;
  64. output(p); //输出排列结果
  65. }
  66. }

  67. void output(int *p)
  68. {
  69.         int s=0;
  70. for(int i=0;i<N;i++)
  71. s=s*10+p[i];
  72. m[n++]=s;
  73. //printf("%06d",s);
  74. //printf("\n");

  75. }
复制代码

2M.rar

407.81 KB, 下载次数: 2, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

perm2.txt

6.48 KB, 下载次数: 0, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 05:52:29 | 显示全部楼层
你的素数列表有问题.我的要求的是2开始的素数列表
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 08:02:30 | 显示全部楼层
55# mathe
为什么不是10000开始的质数呢?不是说其中一个为5位数?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 08:26:31 | 显示全部楼层
因为若用试除法,
得先排除有小于10000的小因子的情形,
如果你的素数表缩水了,将无法进行该过程。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 09:49:00 | 显示全部楼层
57# gxqcn
你的意思是说
我的结果中有的除数是质数,商是合数?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 09:57:10 | 显示全部楼层
right!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-8-28 10:57:49 | 显示全部楼层
我明白了,如果一个电话号码没有比10000小的质因数,而又有一个比10000大的质因数,那么除以其得到的商一定也是质数
这里用到了电话号码<19e10的条件
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-3-29 01:00 , Processed in 0.046862 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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