我的问题看起来像这样:
问题是:在程序结束时,您在步骤1中插入的所有数字必须按其数字总和排序(按递增顺序排序)。
请注意!例如,如果两个数字(例如123和12300)具有相同的数字总和,则必须按字典顺序对它们进行排序。
我不想自己创建函数构建但是我想从库中使用“sort”函数但是我有问题..是否可以使用sort函数来按字典顺序排序?有人可以帮助我吗? 示例输入:
6
13
36
27
12
4
123
预期产出:
12
13
4
123
27
36
我的代码:
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
vector<vector<int> > vec;
int num;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> num;
vector<int> row;
row.push_back(num);
//conversion int to string:
ostringstream ss;
ss << num;
string str = ss.str();
int sum = 0;
for (int g = 0; g < str.length(); g++){
int pom = str[g] - '0';
sum += pom;
}
row.push_back(sum);
vec.push_back(row);
row.clear();
}
//sort(vec[0][0], vec[vec.size()][0]);
for (int i = 0; i < vec.size(); i++){
for (int j = 0; j < 2; j++){
//cout << vec[i][j] << " ";
}
cout << vec[i][0] << endl;
}
system("pause");
return 0;
}
答案 0 :(得分:2)
您可以将每个数字存储为字符串,但也可以预先计算其数字和,并将其保存在pair<int,string>
中,然后将它们放入vector<pair<int,string>
和sort
。 不需要自定义比较器,std::pair
的那个就完全符合您的要求。
// note: std::pair<std::string,int> would not work
typedef std::pair<int,std::string> number;
std::vector<number> numbers;
// fill numbers such that number::first holds the digit sum
// and number::second the number as string.
// this is similar to your code
std::sort(numbers.begin(), numbers.end());
// now numbers are ordered as you want them
答案 1 :(得分:2)
只需将合适的比较函数(或函子,例如lambda就是自然的)传递给std::sort
。
答案 2 :(得分:1)
由于您希望首先比较数字之和,然后按字典顺序比较以断开关系,因此将输入数字转换为字符串会很方便。
从那里你可以定义一个自定义比较器来实现所需的行为:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int sumDigits(string s)
{
int sum = 0;
for (unsigned int i=0; i<s.length(); ++i)
{
sum += s[i] - '0';
}
return sum;
}
bool digitSumComparator(int i, int j)
{
int iSum = sumDigits(to_string(i));
int jSum = sumDigits(to_string(j));
if (iSum == jSum)
{
return iStr < jStr;
}
else
{
return iSum < jSum;
}
}
int main()
{
vector<int> v {6,13,36,27,12,4,123};
sort(v.begin(), v.end(), digitSumComparator);
for (vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
{
cout << *it << ' ';
}
cout << '\n';
return 0;
}
输出:
$ g++ -std=c++11 digitsumsort.cpp
$ ./a.out
12 13 4 123 6 27 36