2016-11-23 46 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

另外,祝你好运在你的训练中,这里的人不要像新人一样简单的任务,并认为他们懒惰,但他们都在这条道路上,我包括:) –