A1.A+B problem 两种题解
2025-08-14 19:50:37
发布于:浙江
第一种题解(1.0)
*✅ 一、题目分析
题目要求:
输入两个整数 a 和 b,输出它们的和 a + b。
输入格式:
一行,两个整数。
输出格式:
一个整数,表示它们的和。
数据范围:
0
≤
a
,
b
≤
1
0
9
0≤a,b≤10
9
✅ 二、你的代码分析
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b;
return 0;
}
这段代码结构清晰,逻辑简单,完成了以下几步:
引入标准输入输出库。
使用标准命名空间。
函数。
定义两个整型变量 a 和 b。
使用 cin 读取输入。
使用 cout 输出两数之和。
返回 0,表示程序正常结束。
✅ 三、时间复杂度分析
我们来逐行分析代码的时间复杂度:
行号 代码 时间复杂度
1 #include <iostream> 编译时处理,不计入运行时间
2 using namespace std; 不计入运行时间
3 int main() { 开始函数调用,O(1)
4 int a, b; 声明变量,O(1)
5 cin >> a >> b; 输入操作,O(输入固定两个整数)
6 cout << a + b; 输出操作,O(1)
7 return 0; O(1)
总结:
所有操作都是常数时间操作。
没有循环、递归、复杂数据结构。
所以,整个程序的时间复杂度是:
O
(
1
)
O(1)
✅ 四、信奥知识扩展
- 什么是时间复杂度?
时间复杂度是用来描述程序运行时间与输入规模之间关系的函数。它衡量的是算法的效率。
在这个问题中,输入规模是固定的(只有两个整数),所以无论输入多大(只要在数据范围内),程序运行时间几乎不变。
- 为什么用 int 类型足够?
题目给出的数据范围是
0
≤
a
,
b
≤
1
0
9
0≤a,b≤10
9
int 类型在大多数 C++ 编译器中是 4 字节,范围是 -2^{1,即
−
2147483648
∼
2147483647
−2147483648∼2147483647
所以 int 能容纳
0
∼
1
0
9
0∼10
9
,是足够的。
3. 如果数据范围更大怎么办?
如果题目给出
a
,
b
≤
1
0
18
a,b≤10
18
,就需要使用 long long 类型:
long long a, b;
cin >> a >> b;
cout << a + b;
*
#include <iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}
第二种题解(2.0)
#include<bits/stdc++.h>
#include<iostream>
#include<stack>
#include<algorithm>
#include<string>
#include<queue>
#include<iomanip>
#define N 210
using namespace std;
int as[N],bs[N],lena,lenb;
string a,b;
int main(){
cin>>a>>b;
lena=a.size();
lenb=b.size();
for(int i=0;i<lena;i++)as[i]=a[lena-i-1]-'0';
for(int i=0;i<lenb;i++)bs[i]=b[lenb-i-1]-'0';
int length=max(lena,lenb);
for(int i=0;i<length;i++)as[i]+=bs[i];
for(int i=0;i<length;i++){
if(as[i]>9){
as[i+1]++;
as[i]-=10;
if(i==length-1)length++;
}
}
while(length&&as[length]==0)length--;
for(int i=length;i>=0;i--)cout<<as[i];
cout<<endl;
}
🧠 一、题目分析
题目要求:
输入两个整数 a 和 b
输出它们的和 a + b
数据范围:0 ≤ a, b ≤ 10^9
正常解法:
直接使用 int 或 long long 类型相加即可:
int a, b;
cin >> a >> b;
cout << a + b << endl;
时间复杂度:O(1)
🤔 二、代码分析
代码实现的是一个大整数加法器,使用字符串存储数字,模拟手工加法的方式进行处理。虽然题目数据范围不大,但你选择了更通用、适用于更大数的解决方案。
⏱️ 三、逐段分析代码时间复杂度
我们逐个函数和循环分析:
1. 输入字符串 a 和 b:
cin >> a >> b;
时间复杂度:取决于输入长度,设为 n 和 m,分别表示 a 和 b 的位数。
O(n + m)
2. 将字符串反转并转为数字数组:
for(int i=0; i<lena; i++) as[i] = a[lena-i-1] - '0';
for(int i=0; i<lenb; i++) bs[i] = b[lenb-i-1] - '0';
每个循环执行 n 和 m 次。
O(n + m)
3. 进行加; i<length; i++) as[i] += bs[i];
- `length = max(n, m)`
- **O(max(n, m))**
---
### 4. 处理进位:
```cpp
for(int i=0; i<length; i++) {
if (as[i] > 9) {
as[i+1]++;
as[i] -= 10;
if(i == length - 1) length++;
}
}
最坏情况下每一位都需要进位,例如 999999999 + 1
最多进位 max(n, m) + 1 次
O(max(n, m))
5. 去除前导零:
while(length && as[length] == 0) length--;
最多循环 `max(n, m 次
O(max(n, m))
for(int i=length; i>=0; i--) cout << as[i];
- 最多输出 ` 1` 位, m))**
---
## 📈 四、总时间复杂度分析
将所有步骤加起来:
- 输入:`O(n + m)`
-:`O(n + m)`
- 加法模拟:`O(max(n, m))`
- 进位处理:`O(max(n, m))`
- 去除前导零:`O(max(n, m))`
- 输出结果:`O(max(n, m))`
### 总时间复杂度:
$$
\boxed{O(n + m)}
$$
其中:
- `n = a.size()`
- `m = b.size()`
---
## 🎯 五、信奥竞赛视角点评
### ✅ 优点:
- 你已经掌握了**大整数加法**的实现原理,这是高精度运算的基础。
- 使用了**字符串处理 + 数组模拟进位**,这是信奥中处理大数问题的常见方法。
- 代码结构清晰,逻辑完整,能处理前导零和进位边界情况。
**
这里空空如也
有帮助,赞一个