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

1.题目:

PAT乙级-1056. 组合数的和(15)_第1张图片

2.分析题目:

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

3.解决思路:

首先,我们要在内心里坚定一个信念。计算机技术是以数学为基础的,是以图灵机为基本模型的。所以我们在解决计算机世界的问题的时候,完全可以套用解决数学问题的套路。这里我们只需要一个很简单的推演,如下图:
PAT乙级-1056. 组合数的和(15)_第2张图片
思路十分地简单,如果你有排列组合相关的知识,这个图多不用看。你自然而然地知道排列与组合之间的差别就在于有无顺序。当我们明白了这样一个浅显的道理之后,我们就可以开始答题了。

4.代码

#include 
#include 
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<return 0;
}

5.一些闲话

对于刷题的世界我也只是刚刚开始,所以有一些地方可能不是那么完美,请见谅。比如这一次的代码我就是抱着可能无法ac的心情写完的。结果却通过了,变量命名似乎不是很规范,不过,相信我,我已经尽力了。下一次我会做得更好,其实编程就是这样,永远相信下一次可以做得更好。加油

你可能感兴趣的:(Algorithm,C++,PAT)