1056 组合数的和 (15 分)

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 个位数字,也就是说这些两位数字的个位和十位都是不同的!

总结:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值