您的位置:首页 > 其它

PAT乙级-1056. 组合数的和(15)

2018-01-18 11:04 225 查看

1.题目:



2.分析题目:

首先,一定要仔细分析题目。题中说要求所有可能组合出来的2位数字的和。还给出了例子。另外,输入时,会给出N个不同的非0的数字,以空格分隔。那么,我们应该如何构造所有可能的两个个位数的两位数组合呢?

3.解决思路:

首先,我们要在内心里坚定一个信念。计算机技术是以数学为基础的,是以图灵机为基本模型的。所以我们在解决计算机世界的问题的时候,完全可以套用解决数学问题的套路。这里我们只需要一个很简单的推演,如下图:



思路十分地简单,如果你有排列组合相关的知识,这个图多不用看。你自然而然地知道排列与组合之间的差别就在于有无顺序。当我们明白了这样一个浅显的道理之后,我们就可以开始答题了。

4.代码

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv) {
vector<int> nums;// 承装所有数字的数组
int n;
cin>>n;
// 初始化所有的原始数字
while(n--){
int temp;
cin>>temp;
nums.push_back(temp);
}
vector<int> addNums;// 所有进行排列组合后得到的数
vector<int>::iterator it =nums.begin();
// 进行双层遍历,从左到右进行,因为两个数字的搭配只有ab 或者 ba 这两种情况,所以可以只从左到右遍历一遍
for(;it!=nums.end();++it)
{
vector<int>::iterator it_behind = nums.begin();
// 将游标移动到主游标的后面
for(;it_behind!=it;it_behind++){}
it_behind++;
// 开始遍历
for(;it_behind!=nums.end();it_behind++){
addNums.push_back(*it*10+*it_behind);
addNums.push_back(*it_behind*10+*it);
}
}
vector<int>::iterator set_it = addNums.begin();
int result=0;
// 使用迭代器遍历,获得最终求和结果
for(;set_it!=addNums.end();set_it++){
result+=*set_it;
}
cout<<result;
return 0;
}


5.一些闲话

对于刷题的世界我也只是刚刚开始,所以有一些地方可能不是那么完美,请见谅。比如这一次的代码我就是抱着可能无法ac的心情写完的。结果却通过了,变量命名似乎不是很规范,不过,相信我,我已经尽力了。下一次我会做得更好,其实编程就是这样,永远相信下一次可以做得更好。加油
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT