程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj2718-Smallest Difference(枚舉全排列),

poj2718-Smallest Difference(枚舉全排列),

編輯:C++入門知識

poj2718-Smallest Difference(枚舉全排列),


一,題意:
  給出最多10個數字,將它們劃分為兩個整數,求差值最小的值(除非只有一位數,否則不允許出現先導0)
  很顯然如果總共有n個數,必然有一個整數長n/2,另一個長n-n/2。
二,思路:
  利用next_permutation()函數枚舉數字的每個排列
三,步驟:
  1,輸入字符數組,並轉換為整形數組;
  2,利用next_permutation()函數,枚舉數組的每一個排列,根據條件求出劃分的兩個整數的差值最小值。

1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 6 int main() { 7 char s[1000]; //利用字符數組存儲,是因為並不知道會輸入幾個數,那麼我們就定義字符數組來存儲輸入一行的字符。 8 int t; 9 cin >> t; 10 getchar(); //這裡getchar()是接收上面輸入t後的回車符,若沒有,則下面的gets_s()函數,就會接收回車符。 11 while (t--) { 12 int a[11], num = 0 , ans = 0x3f3f3f3f; //在通常的場合下,設置無窮大時,0x3f3f3f3f是一個非常棒的選擇。如果想把int整形數組初始化為無窮大,我們只需要memset(a,0x3f,sizeof(a)). 13 gets_s(s); //VS2015使用的是新C標准,也就是C11,而VC6.0用的是老標准。在新標准中,用gets_s代替gets 14 for (int i = 0; i < strlen(s); i++) { //將字符數組轉化為整形數組 15 if (s[i] >= '0'&&s[i] <= '9') { 16 a[num++] = s[i] - '0'; //a[]用來存儲s[]轉化得到的整形數組 17 } 18 } 19 sort(a, a + num); 20 do { 21 int num1 = 0, num2 = 0; 22 if (!a[0] || !a[num/2] && num>2) //前面那個數的首位不能是0 或者 後面那個數的首位也不能是0 , 還有當為輸入是 10 時 ,要麼前面那個數的是0, 要麼後面的那個數是0,所以條件 num>2 加"||"前後都一樣 23 continue; 24 for (int i = 0; i < num/2; i++) { 25 num1 = num1 * 10 + a[i]; //前一半數組的數,化為整數 26 } 27 for (int i = num / 2; i < num; i++) { 28 num2 = num2 * 10 + a[i]; //後一半數組的數,化為整數 29 } 30 ans = min(ans, abs(num1 - num2)); 31 } while (next_permutation(a, a + num)); 32 cout << ans << endl; 33 } 34 return 0; 35 } View Code

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

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