1056 组合数的和 (15 分)
题意描述:
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。
输入格式:
输入在一行中先给出 N(1 < N < 10),随后给出 N 个不同的非 0 个位数字。数字间以空格分隔。
输出格式:
输出所有可能组合出来的2位数字的和。
输入样例:
3 2 8 5
输出样例:
330
解题思路:
Alice:这道题??
Bob:好做嘞,只是两位数而已。
Alice: 嘛意思? 你先把两位数的事讲清楚了。
Bob: 看题目就是给出所有的排列嘛,A32 = 6
。 看题意描述里面给出的例子就是从5, 2, 1这三个数中任意选出两个来排列成一个整数,然后再把这些整数加起来吧。
Alice: 是这样唉,你还挺聪明嘞
Bob:(´⊙ω⊙`)
Alice: 然后呢,怎么用代码把排列写出来呢?
Bob: 两层循环就好了啊,第一层循环把第一个数挑出来,第二层再挑出一个和第一个数不同的数。然后,就没了,哈哈哈哈。而且题目里还说N个数字都是不一样的,如果有重复的数字还要按着位置来,现在直接判断不一样就好了。
Alice: 按着位置来? 比如说有2, 2, 3 要组成两位数的,就有22 23 22 23 32 32 然后再丢掉重复的 ?
Bob: 恩,我是这样想的,具体的还要根据题目的情况具体分析。
Alice:那别的呢?如果不是两位数怎么办?
Bob: 这个就不好做了,3位数我们可以写3重循环,10位数呢?100位数呢?或者n个数字,n位的排列呢? 这个好像就是如何生成一个集合的全排列的问题?
Alice: 好像还有如何生成一个集合的全部子集的问题?
Bob: ┐(:´ゞ`)┌我大概下周就会了…
Alice: 哈哈哈哈,(*❦ω❦)
代码:
def main():
nums = [int(x) for x in input().split()[1:]]
# 接收输入的整数序列, 注意这里我们使用了python的切片操作
# 由于第一个数字是N, (没有什么用),所以我们使用切片丢掉了这个元素
answer = 0
for x in nums:
# 从这堆数字中找出一个作为这个数字的第一位
for y in nums:
if x != y:
# 找到另一个数字作为这个数字的第二位
answer += x * 10 + y
# 把这个数字(x * 10 + y)累加进去
print(answer)
# 输出所有的两位数字的和
if __name__ == '__main__':
main()
#include <stdio.h>
int main(){
int N = 0;
int numbers[10];
int answer = 0;
scanf("%d", &N);
// 读入第一个整数 N
for(int i=0; i<N; ++i){
scanf("%d", &numbers[i]);
// 依次读入其余的N个不同的整数
}
for(int i=0; i<N; ++i){
for(int j=0; j<N; ++j){
if (j != i){
answer += numbers[i] * 10 + numbers[j];
// 任何两个不同的数字都可以组成一个两位数,然后被加起来
}
}
}
printf("%d\n", answer);
return 0;
}
易错点:
- 题目中要求 用其中任意 2 个数字都可以组合成 1 个 2 位的数字而且随后给出 N 个不同的非 0 个位数字,也就是说这些两位数字的个位和十位都是不同的!
总结: