題目:
面試廈門(mén)歐樂(lè)時(shí)的一道編程題,拿出來(lái)大家共同學(xué)習(xí)一下:從1到100000中隨意取出兩個(gè)數(shù),然后將其余99998個(gè)數(shù)打亂放入數(shù)組A中,現(xiàn)在要求遍歷一次數(shù)組A,就要找到取出的那兩個(gè)數(shù)。要求:最多只能定義5個(gè)變量,不能定義數(shù)組。大家有興趣的試試。
可以這么考慮,設(shè)那連個(gè)數(shù)為x和y,獲得x+y和x*x+y*y的值,那么就可以算出x和y出來(lái)。
x+y可以從1到100000的和減去數(shù)組之和得出,x*x+y*y可以從1到100000的平方和減去數(shù)組之平方和獲得,然后就可以計(jì)算具體x和y。同理,如果找3個(gè)數(shù),那么將要技術(shù)立方和,以此類推。
下面是本人所寫(xiě)的代碼。
#include
#include
#include
#include
#define MAX 100000
void show(int *array,int len)
{
std::cout< return;
for(int i=0;i {
if(i%10==0)
std::cout< std::cout< }
std::cout<<’\n’;
}
int run(int *array,int len)
{
unsigned long expectSum=(1+len+2)*(len+2)/2;
unsigned long expectDSum=(len+1)*(len+1)+(len+2)*(len+2);
unsigned long arraySum=0;
unsigned long arrayDSum=0;
for(int i=0;i {
expectDSum+=(i+1)*(i+1);
arraySum+=array[i];
arrayDSum+=array[i]*array[i];
}
std::cout<<"expectSum:"< <<"expectDSum:"< <<"arraySum:"< <<"arrayDSum:"< unsigned long A=expectDSum-arrayDSum;
unsigned long B=expectSum-arraySum;
unsigned long C=(2*A-B*B);
std::cout<<"x+y="< <<"x*x+y*y:"< <<"2*A-B*B:"< unsigned long x_y=sqrt(C);
std::cout<<"x-y:"< std::cout<<"x:"<<(x_y+B)/2<<’\n’;
std::cout<<"y:"<<(B-x_y)/2<<’\n’;
return 0;
}
int main()
{
int array[MAX];
for(int i=0;i array[i]=i+1;
show(array,MAX);
srand(time(NULL));
for(int i=0;i {
int start=rand()%MAX;
int temp=array[i];
array[i]=array[start];
array[start]=temp;
}
show(array,MAX);
run(array,MAX-2);
return 0;
}
面試廈門(mén)歐樂(lè)時(shí)的一道編程題,拿出來(lái)大家共同學(xué)習(xí)一下:從1到100000中隨意取出兩個(gè)數(shù),然后將其余99998個(gè)數(shù)打亂放入數(shù)組A中,現(xiàn)在要求遍歷一次數(shù)組A,就要找到取出的那兩個(gè)數(shù)。要求:最多只能定義5個(gè)變量,不能定義數(shù)組。大家有興趣的試試。
可以這么考慮,設(shè)那連個(gè)數(shù)為x和y,獲得x+y和x*x+y*y的值,那么就可以算出x和y出來(lái)。
x+y可以從1到100000的和減去數(shù)組之和得出,x*x+y*y可以從1到100000的平方和減去數(shù)組之平方和獲得,然后就可以計(jì)算具體x和y。同理,如果找3個(gè)數(shù),那么將要技術(shù)立方和,以此類推。
下面是本人所寫(xiě)的代碼。
#include
#include
#include
#include
#define MAX 100000
void show(int *array,int len)
{
std::cout< return;
for(int i=0;i
if(i%10==0)
std::cout<
std::cout<<’\n’;
}
int run(int *array,int len)
{
unsigned long expectSum=(1+len+2)*(len+2)/2;
unsigned long expectDSum=(len+1)*(len+1)+(len+2)*(len+2);
unsigned long arraySum=0;
unsigned long arrayDSum=0;
for(int i=0;i
expectDSum+=(i+1)*(i+1);
arraySum+=array[i];
arrayDSum+=array[i]*array[i];
}
std::cout<<"expectSum:"<
unsigned long B=expectSum-arraySum;
unsigned long C=(2*A-B*B);
std::cout<<"x+y="< <<"x*x+y*y:"< <<"2*A-B*B:"<
std::cout<<"x-y:"<
std::cout<<"y:"<<(B-x_y)/2<<’\n’;
return 0;
}
int main()
{
int array[MAX];
for(int i=0;i
show(array,MAX);
srand(time(NULL));
for(int i=0;i
int start=rand()%MAX;
int temp=array[i];
array[i]=array[start];
array[start]=temp;
}
show(array,MAX);
run(array,MAX-2);
return 0;
}

