C++實(shí)例:一道C++筆試題

字號(hào):

題目:
    面試廈門(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;
    }