2016-11-23 64 views
-1

我有解決此問題的問題。 這個任務很簡單,首先輸入我有多少個例子。 在第二行我需要輸入即將閱讀的數字。 然後我們輸入空格分隔的所有數字。 這個任務本身就是這樣做的,它將字符串數組從小寫到最大。之後,如果我們輸入偶數,我們打印中間數字-1,如果它們不均勻,我們只打印中間數字。使用數字C++排序字符串數組

到目前爲止,如果我使用完全相同的長代碼,它完美的作品,但它只限於19位數字,我想擴大該程序,使其可以使用更大的數字。

使用這種方式的排序功能,當我嘗試從160到10排序16個元素,他們都搞砸了從110開始,然後在midle是160,所以一個,這使得絕對無意義,使用5個數字或8完美無缺地工作,使用更多數字失敗。

#include <iostream> 
#include <algorithm> 
#include <string> 

using namespace std; 




int main() { 
int examples; 
cin >> examples; 
for (size_t i = 0; i < examples; i++) 
{ 
    long long unsigned int n; 
    cin >> n; 
    string * numbers = new string[n]; 
    for (size_t i = 0; i < n; i++) 
    { 
     cin >> numbers[i]; 
    } 

    sort(numbers, numbers + n); 

    if (n % 2 == 0) { 
     cout << numbers[n/2 - 1]; 
    } 
    else 
     cout << numbers[n/2]; 



} 

system("pause"); 
return 0; 
} 
+1

您是否嘗試過使用調試器? –

+1

有幾個「bignum」庫。嘗試並搜索一下。 –

+0

看看'__int128' – Raindrop7

回答

2

首先,如果你與運營商新的分配內存,你必須與運營商釋放它刪除[]。其次,當你對字符串進行排序而不是數值時,它們就像字符串一樣排序,這裏就是你的問題所在。你看,100是按字母順序少於2或20,這就是爲什麼它會更早出現。

下面是你的程序給出的輸出。檢查這個規則,你會看到我是對的。

10 100 110 120 130 140 150 160 20 30 40 50 60 70 80 90 

第三,使用operator new幾乎不鼓勵任何事情。你有STL,你似乎在廣泛使用它 - 爲什麼不是矢量?

第四,你不檢查我們寫入數字[i]的任何東西其實是一個數字。想一想。第五,對於N足夠長(大於2^sizeof(size_t)),您的問題永遠不會因整數溢出而停止。

第六,你不檢查n == 0,如果你輸入它,你最終會得到內存訪問衝突。

你的問題的快速右現成的蝙蝠修復:

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <vector> 

using namespace std; 

int main() { 
    int examples; 
    cin >> examples; 
    for (size_t i = 0; i < examples; i++) 
    { 
     size_t n; 
     cin >> n; 
     if (n <= 0) 
      break; 
     vector<string> numbers(n); 
     for (size_t i = 0; i < n; i++) 
      cin >> numbers[i]; 

     //here we add a predicate for string checking, 
     //which evaluates the length of string 
     //before using the usual operator<. 

     sort(begin(numbers), end(numbers), [](const string& s1, const string& s2){ 
      if (s1.length() < s2.length()) 
       return true; 
      if (s2.length() < s1.length()) 
       return false; 
      else 
       return (s1 < s2); 
     }); 

     if (n % 2 == 0) { 
      cout << numbers[n/2 - 1]; 
     } 
     else 
      cout << numbers[n/2]; 
    } 

    system("pause"); 
    return 0; 
} 

儘管如此,它有許多的問題:

  1. 察看號[I]實際上是一個數

  2. 我不確定我寫的 謂詞沒有錯誤 - 我只是想給你 它應該如何工作的想法。

+0

非常感謝你,因爲你所做的清理,我確實知道唯一的方法是比較字符串的長度,但我真的缺乏知識來重寫排序函數,就像你做的那樣。 至於其他問題,他們並不重要,這只是一個作業:)。 這是在條件,它將永遠是一個正數n在1和10^6之間,數字本身總是正數從1到n^20 + :) – JohnSmithEr

+0

看看這篇文章關於lambda表達式(修改排序我做了),它會給你一個關於我在這裏做了什麼的想法:http://www.drdobbs.com/cpp/lambdas-in-c11/240168241 –

+0

另外,祝你好運在你的訓練中,這裏的人不要像新人一樣簡單的任務,並認爲他們懶惰,但他們都在這條道路上,我包括:) –