1、问题:证明哥德巴赫猜想!即从6到n的任意偶数均能拆成两个素数的和!
问题:证明哥德巴赫猜想!即从6到n的任意偶数均能拆成两个素数的和!若有高效算法请与我联系!
今年真是流年不利呀!在华为招聘网上报名的职位搞到传说找人极少的部分IT管理类,信息安全,本想好好燃烧一下,可是人家不给机会真是郁闷!
事情是这样的!
华为IT管理类要求有笔试,写了好几年Java,为了这个考试加班加点看了一遍C。好不容易通过华为笔试,听说面试就是考算法,也没太当回事,
毕竟写了这么多年程序,就是C的语法比较郁闷!大意啦,大意啦!
见到面试官,他给我一道题后就去面试其他同学了,我的题目是:证明哥德巴赫猜想。当时挺紧张,不过感觉答得还成,做完后面试官过来看了看
我的程序说:“思想不好,回去等通知!”当时我的心就凉了,大家都知道华为是当场面试四轮,如果你在第一轮就被宣布“等通知”,那就没戏了。
我问:“我的算法哪里有问题?”面试官很和蔼的高告诉我,这个是保密的。这是我有生以来的第一次面试,本来十分期待进入华为,真的是本身就
很喜欢这个公司,喜欢他狼性的企业文化,可是这一切就这么离我远去!!
我把我写的程序整理了一下,希望大家能帮我提提意见,我的算法究竟差在什么地方呢?
#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;
}
2、
真没想到昨天晚上投的慧通,今天晚上就收到笔试通知。真不愧是华为的合作伙伴,连答题纸都长得一样!有意思的试题如下。
1。char *p = "ab";
printf("%d,%d ",p,p+5);
地址问题,类型为char的地址下移5个为原地址值+5;今天做错了:(2。int i=10,j=20,k=30;
k *= i+j;
printf("%d ",k);输出为900,考优先级,做对了:)
3。enum string{x1,x2,x3=10,x4,x5};
int x=x5;
printf("%d,%d ",x,x1);输出为12,0,做错了:(
4。int data[1024];
问实际使用的数组范围,应该是0~1023,呜呜,我还以为数组不能太大呢!原来这么大也可以!
5。typedef union data{
long l;
double d;
}Data;
sizeof(data),sizeof(Data)的值都是8,取sizeof(double)的值,而不是sizeof(double)和sizeof(int)的和。6. void *memcpy(void *destin, void *source, unsigned n);
n不能超过目标的长度。此函数定义在<string.h>中。
暂时能想起来这么多,今天的大题是:将一个字符串如“abcde”反向输出“edcba”。我的方法是将对称的两个字母换位。
3/
今天群硕笔试,考了好多内容,其中Java占很大部分!
本试卷中最有难度的编程题:给定一个数组,这个数组中既有正数又有负数,找出这个数组中的子数组,此子数组的和最大!(思考中,有好办法留言呀!)
最不知道怎么答的题:在TCP/IP中最经常使用的编程方法?
最简单的题:final, finally, finalize的区别(因为经常考)
最容易疏忽的题:main(){C c;}在前面已经定义了C的类,这个地方容易迷糊的就是,没有new,照样执行构造函数,没有free,照样执行析构函数。
最迷糊的题:一个无向图是否能够存到树中?为什么?
最然我感到有差距的题:EJB中一定包括()interface,()interface,()class
给定一个数组,这个数组中既有正数又有负数,找出这个数组中的子数组,此子数组的和最大!
我是西北大学的,把这到题写了. 测试过.竟请参考!如有疑问可联系本人,qq:121083095
#include<stdio.h>
void main()
{
int a[15]={2,3,-4,5,6,-5,-1,14,9,-10,1,-71,75,4,-9};
int b[15]; //计算和
int num=a[14];
int c[15]; //最大尾数标志数组
int n=14;
int i,j=0;
for(i=14;i>=0;i--) //从后计算和放入b中
{
c[i]=n;b[i]=num;
if(num<0){n=i-1;num=0;}
num=num+a[i-1];
}
printf("/n");
for(i=0;i<15;i++)
printf("%d, ",b[i]);
printf("/n");
//找到最大字符子串
num=b[0];n=c[0];
for(i=0;i<15;i++)
if(b[i]>num){num=b[i];j=i;n=c[i];}
for(i=j;i<=n;i++)
printf("%d, ",a[i]);
printf("sum=%d",num);
}