免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5759 | 回复: 7
打印 上一主题 下一主题

[算法] 哥德巴赫猜想的验证算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-16 21:39 |只看该作者 |倒序浏览
这个是我参加华为面试时候的题目,下面是我的实现代码,面试官说思想有问题,我想请教大家一下,我的毛病究竟出现在哪里呢?请大家指点一下。下面的算法可以直接运行。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
bool judge(int t)
{
        for(int i=2;i<=sqrt(t);i++)
                if(t % i == 0)
                        return false;
        return true;
}
bool find(int array[],int t,int j)
{
        int max = j-1;
        int min = 0;
        while(min <= max)
        {
                if(array[(min+max)/2] == t)
                        return true;
                if(array[(min+max)/2] > t)
                        max = (min+max)/2-1;
                else
                        min = (min+max)/2+1;
        }
        return false;
}
int f(int n)
{
        int j=0;
        int * array ;
        bool flag = false;
        array = (int *)malloc(sizeof(int)*n/2);
        for(int i=3;i<=n-3;i++)
                if(judge(i))
                        array[j++]=i;
        for(i=6;i<=n;i=i+2)
        {
                int pos = 0;
                flag = false;
                while(array[pos] <= i/2)
                {
                        if(find(array,i-array[pos],j))
                        {
                                flag = true;
                                break;
                        }
                        pos++;
                }
                if(!flag)
                        return 1;
        }
        return 0;
}
int main()
{
        int n;
        scanf("%d",&n);
        cout<<f(n);
        return 0;
}

[ 本帖最后由 yaomingwei_ren 于 2005-11-17 12:31 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-11-16 22:22 |只看该作者
应该叫验证算法吧

论坛徽章:
0
3 [报告]
发表于 2005-11-17 12:23 |只看该作者
对,是验证算法,今天改进了一下find和f函数
int find(int array[],int t,int j)
{
        int max = j-1;
        int min = 0;
        while(min <= max)
        {
                if(array[(min+max)/2] == t)
                        return -1;
                if(array[(min+max)/2] > t)
                        max = (min+max)/2-1;
                else
                        min = (min+max)/2+1;
        }
        return min;
}
int f(int n)
{
        int j=2;
        int * array ;
        bool flag = false;
        array = (int *)malloc(sizeof(int)*n/2);
        array[0]=3;
        array[1]=5;
        for(int i=6;i<=n;i++)
        {
                if(i%2 != 0 && judge(i))
                {
                        array[j++]=i;
                        continue;
                }else
                        if(i%2 == 0)
                        {
                                int pos = 0;
                                int pos2 = j;
                                flag = false;
                                while(array[pos] <= i/2)
                                {
                                        if((pos2=find(array+pos,i-array[pos],pos2)) == -1)
                                        {
                                                flag = true;
                                                break;
                                        }
                                        pos++;
                                }
                                cout<<i<<","<<array[pos]<<","<<i-array[pos]<<endl;
                                if(!flag)
                                        return 1;
                        }
        }
        return 0;
}

论坛徽章:
0
4 [报告]
发表于 2005-11-17 12:56 |只看该作者
思想有问题? 这么严重么?

如果考官认为你算法上不合理,你把自己的算法写一下,而不是给出代码,我估计会更多的答复。

至于代码,有不少问题的,比如
(1)  c, c++ 混在一起, scanf, malloc, <<
(2)  c++ 的写法过时了,应该 include <iostream> 而不是 <iostream.h>, 应该 using namespace std.
(3)  malloc 之后没有 free

论坛徽章:
0
5 [报告]
发表于 2005-11-17 13:28 |只看该作者
2个问题:
(1)用大小为n/2的整型数组,当n很大时,内存空间的消耗很厉害。
(2)得到<=n/2的素组列表的算法太差,用筛法是最快的。

论坛徽章:
0
6 [报告]
发表于 2005-11-17 16:34 |只看该作者
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <math.h>

  5. using namespace std;

  6. int next_prime(vector<int>& vPrime)
  7. {
  8.     int n = vPrime[vPrime.size() - 1] + 2;
  9.     int m = (int)sqrt(2.0*n);
  10.     for(int i = n; ; i+= 2)
  11.     {
  12.         vector<int>::const_iterator itr;
  13.         for(itr = vPrime.begin(); *itr <= m && i % (*itr); ++itr);
  14.         if(*itr > m)
  15.         {
  16.             vPrime.push_back(i);
  17.             return i;
  18.         }
  19.     }

  20. }

  21. bool find(vector<int>& vPrime, const int x)
  22. {
  23.     int i=0, j=vPrime.size() - 1, m;
  24.     while(i <= j)
  25.     {
  26.         m = (i + j) / 2;
  27.         if(x == vPrime[m])
  28.             return true;
  29.         else if(x > vPrime[m])
  30.             i = m + 1;
  31.         else
  32.             j = m - 1;
  33.     }
  34.     return false;
  35. }

  36. bool split(vector<int>& vPrime, const int sum, int &x, int &y)
  37. {
  38.     vector<int>::const_reverse_iterator itr;
  39.     for(itr = vPrime.rbegin(); 2*(*itr) >= sum; ++itr)
  40.     {
  41.         if(find(vPrime, sum - (*itr)))
  42.         {
  43.             x = *itr;
  44.             y = sum - (*itr);
  45.             return true;
  46.         }
  47.     }
  48.     int p;
  49.     while((p = next_prime(vPrime)) <= sum - 3 )
  50.     {
  51.         if(find(vPrime, sum - p))
  52.         {
  53.             x = p;
  54.             y = sum - p;
  55.             return true;
  56.         }
  57.     }
  58.     return false;
  59. }

  60. void check(int n)
  61. {
  62.     vector<int> vPrime;
  63.     int x, y;
  64.     vPrime.push_back(2);
  65.     vPrime.push_back(3);
  66.     for(int i = 6; i < n; i += 2) {
  67.         if(split(vPrime, i, x, y))
  68.             cout << i << " = " << x << " + " << y << endl;
  69.         else
  70.             cout << "false[" << i << "]!" << endl;
  71.     }
  72. }

  73. int main()
  74. {
  75.     int sum;
  76.     cin >> sum;
  77.     check(sum);
  78. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2005-11-17 21:23 |只看该作者
感谢大家的指导!尤其感谢yzc2002给出的实现,让我发现差距真的很大!我的C/C++实在是太差了,这样的水平去华为被鄙视也是属于应该!(刚开始我觉得还挺冤的)看来真要好好学习一下C/C++还有数据结构。yzc2002给出的算法时间复杂度要不我的小很多,充分利用了已经求出的素数,真的很巧妙!十分感谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-11-17 21:55 |只看该作者
我怀疑 yzc2002 是搞大型游戏开发的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP