程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 和為S的兩個數字

和為S的兩個數字

編輯:C++入門知識

輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸入: 每個測試案例包括兩行: 第一行包含一個整數n和k,n表示數組中的元素個數,k表示兩數之和。其中1 <= n <= 10^6,k為int 第二行包含n個整數,每個數組均為int類型。 輸出: 對應每個測試案例,輸出兩個數,小的先輸出。如果找不到,則輸出“-1 -1” 樣例輸入: 6 15 1 2 4 7 11 15 樣例輸出: 4 11 思想:因為已經排好序,那麼如果存在那麼兩個數,可能是一個比較大,一個比較小,或者是比較相等的兩個數!所以我們設一個n1=min(即a[0]),n2=max( 即a[n-1] )開始,實際是n1 = a[low],low=0開始,n2 = a[high],high=n-1開始,然後n1+n2與S(我們需要的和)進行比較,若>,則n2 =a[--high];若<, n1=a[++low],若==,則使用mul保存乘積,還要保存兩個數,因為可能不只一對數,它只要乘積小的!掃描直到low>=high終止! 代碼AC: [cpp]   #include <stdio.h>   #include <stdlib.h>      int main()   {          long int n, i, low, high;       long long int mul;       long int  s, *data, m1, m2, flag;              while(scanf("%ld%ld", &n, &s) != EOF )       {            data =( long int* )malloc( sizeof( long int ) * n );            for( i = 0; i < n; i++ )    //             {                 scanf("%ld", &data[i]);            }                        m1 = -1;            m2 = -1;                        low = 0;            high = n - 1;            mul = -1;            flag = 1;                        while( low < high )       // 注意:負數和重復的數字( 可以無視 )            {                 if( data[low] + data[high] > s )                 {                     high--;                 }                 else if( data[low] + data[high] < s )                 {                      low++;                 }                 else                 {                     if( flag )                     {                         mul = data[low] * data[high];                         m1 = data[low];                         m2 = data[high];                         flag = 0;                     }                     else                     {                         if( mul > data[high] * data[low] )                         {                             mul = data[high] * data[low];                             m1 = data[low];                             m2 = data[high];                         }                     }                    // printf("%d %d\n", data[low], data[high]);                     low++;                     high--;                 }            }            printf("%ld %ld\n", m1, m2);            free( data );       }              return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved