1056. 组合数的和(15)

本文介绍了一种算法,该算法接受N个非0个位数字,并计算所有可能的两个数字组合成的两位数之和。例如,对于输入2、5、8,它将计算25、28等所有组合的总和。

给定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

#include <stdio.h>
int main()
{
    int a[10],n,i,j,sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j!=i)
                sum+=a[i]*10+a[j];
        }
    }
    printf("%d",sum);
}
你的代码逻辑基本正确,但存在一个关键问题:**输入读取方式错误**。 你使用了 `while(cin >> num)` 来持续读取输入,这会导致程序一直等待输入,直到遇到 EOF(文件结束符)。但在题目中,输入只有一行,包含一个整数 N 紧接着的 N 个数字。因此应该只读取这一行中的 N+1 个整数即可。 此外,你的双重循环是从 `i=0` 到 `a.size()-1`,然后 `j=i+1`,这样只会组合每对数字一次,并且只计算了 `(a[i], a[j])` `(a[j], a[i])` 的两种组合(即 ab ba),这是正确的思路。 但是注意:题目要求的是“任意两个数字”组成两位数 —— 注意是**排列**而不是组合!也就是说,2 5 能组成 25 52,而不管顺序如何,只要两个不同位置的数字就可以互换构成两个不同的两位数。 所以实际上,每个数字对 (i, j),只要 i ≠ j,都应该算一次 10*a[i] + a[j]。 --- ### ✅ 正确解法: 我们应该对每一个数字 `a[i]`,让它作为十位,与其他所有不是它本身的数字 `a[j]` 组合成两位数(即 `10*a[i] + a[j]`),遍历所有 i ≠ j 的情况。 --- ### ✅ 正确 C++ 代码如下: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int N; cin >> N; vector<int> digits(N); for (int i = 0; i < N; ++i) { cin >> digits[i]; } int total = 0; // 枚举所有有序对 (i, j), i != j for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (i != j) { total += digits[i] * 10 + digits[j]; } } } cout << total << endl; return 0; } ``` --- ### 🔍 代码解释: - `cin >> N;`:读取数字个数。 - `vector<int> digits(N);`:创建数组存储 N 个非零个位数。 - 用两层循环遍历所有可能的 **有序对**(因为 25 52 不同): - 外层 `i` 是十位上的数字, - 内层 `j` 是个位上的数字, - 只要 `i != j` 就可以组合成一个两位数。 - 每个两位数为:`10 * digits[i] + digits[j]` - 累加得到总。 --- ### 📌 示例验证: 输入:`3 2 8 5` 数字集合:{2, 8, 5} 所有组合: - 十位为 2:28, 25 - 十位为 8:82, 85 - 十位为 5:52, 58 → 还有: - 十位为 2:28, 25 → 已列 等等,其实完整是: | 十位 | 个位 | 数 | |------|------|----| | 2 | 8 | 28 | | 2 | 5 | 25 | | 8 | 2 | 82 | | 8 | 5 | 85 | | 5 | 2 | 52 | | 5 | 8 | 58 | 共 6 个数:28+25+82+85+52+58 = 330 ✅ 我们的程序会生成这 6 个数(N=3,总共 3×2=6 种) --- ### ❌ 原代码的问题总结: ```cpp while(cin >> num) { ... } ``` 这个写法在标准输入下不会停止,除非手动输入 EOF(如 Ctrl+D 或 Ctrl+Z),否则超时或出错。而题目只给一行输入,必须按格式读取前 N+1 个数。 --- ### ✅ 改进建议: 不要用无限循环读取,而是先读 N,再读 N 个数。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值