目录
HDU1002——A + B Problem II(高精度加法)
HDU1000——A + B Problem
题目描述
运行代码
#include <iostream>
using namespace std;
int main() {
int A, B;
while (cin >> A >> B) {
cout << A + B << endl;
}
return 0;
}
代码思路
直接输出A+B的和
HDU1001——Sum Problem
题目描述
运行代码
#include<iostream>
using namespace std;
int main()
{
long long n;
while (cin>>n)
{
printf("%lld\n\n", n * (n + 1) / 2);
}
return 0;
}
代码思路
求和公式
HDU1002——A + B Problem II(高精度加法)
题目描述
运行代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int T;
cin >> T;
for (int I = 1; I <= T; I++) {
string a, b;
int x[1005] = { 0 };
int y[1005] = { 0 };
int sum[1010] = { 0 };
cin >> a >> b;
int p = a.size();
int q = b.size();
int u = 1;
int v = 1;
int w = 1;
for (int i = p - 1; i >= 0; i--) { // 将每个数字倒序输入整形数组
x[u++] = a[i] - '0'; // 将字符变为数字
}
for (int i = q - 1; i >= 0; i--) { // 将每个数字倒序输入整形数组
y[v++] = b[i] - '0'; // 将字符变为数字
}
u = u - 1; // 记录数字的位数
v = v - 1;
if (u >= v) // 进行模拟加法
{
for (int i = 1; i <= u; i++) {
int e = x[i] + y[i] + sum[w];
if (e < 10)
sum[w++] = e;
else {
sum[w] = e - 10;
w++;
sum[w] = sum[w] + 1;
}
}
}
else {
for (int i = 1; i <= v; i++) {
int e = x[i] + y[i] + sum[w];
if (e < 10)
sum[w++] = e;
else {
sum[w] = e - 10;
w++;
sum[w] = sum[w] + 1;
}
}
}
cout << "Case " << I << ":" << endl; // 按要求进行格式化输出
for (int i = u; i >= 1; i--) {
cout << x[i];
}
cout << " + ";
for (int i = v; i >= 1; i--) {
cout << y[i];
}
cout << " = ";
if (sum[w] != 0)
cout << sum[w];
for (int i = w - 1; i >= 1; i--) {
cout << sum[i];
}
cout << endl;
if (I != T)
cout << endl; // 依照题目要求,在两个输出行之间有个空行。
}
return 0;
}
代码思路
-
首先,读取测试用例的数量
T
。 -
对于每个测试用例,读取两个字符串
a
和b
,代表要相加的两个大整数。 -
创建三个数组
x[]
、y[]
和sum[]
。x[]
和y[]
用于分别存储字符串a
和b
中的数字,而sum[]
用于存储加法的结果。 -
使用循环将字符串中的数字转换为整数,并反向存储在
x[]
和y[]
数组中。这是因为从最低位开始进行加法更容易。 -
初始化
u
和v
作为a
和b
的长度减一,这是因为数组是从1开始索引的。 -
执行加法操作,根据两个数的长度选择较长的一个进行循环。在每次迭代中,将对应的位相加,同时加上来自更高位的进位(如果有的话),并将结果存储在
sum[]
数组中。 -
输出格式化后的结果。首先输出测试用例的编号,然后是原始的两个大整数(按照原始顺序输出),接着是等于号和加法的结果。
-
在不同的测试用例之间,输出一个空行以便区分。
高精度加法模板
//C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
HDU1003——Max Sum
题目描述
运行代码
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
for (int i = 1; i <= T; i++) {
int n;
cin >> n;
int a[100005];
for (int j = 0; j < n; j++) {
cin >> a[j];
}
int maxSum = a[0];
int currentSum = a[0];
int start = 0;
int end = 0;
int tempStart = 0;
for (int j = 1; j < n; j++) {
if (currentSum + a[j] < a[j]) {
currentSum = a[j];
tempStart = j;
}
else {
currentSum += a[j];
}
if (currentSum > maxSum) {
maxSum = currentSum;
start = tempStart;
end = j;
}
}
cout << "Case " << i << ":" << endl;
cout << maxSum << " " << start + 1 << " " << end + 1 << endl;
if (i != T) {
cout << endl;
}
}
return 0;
}
代码思路
-
读取测试用例数量:首先,从标准输入读取一个整数
T
,表示有多少组测试数据。 -
处理每组测试数据:
- 对于每一个测试案例,首先读入一个整数
n
,代表数组的长度。 - 然后,读入一个长度为
n
的整数数组a
。
- 对于每一个测试案例,首先读入一个整数
-
计算最大子数组和及其位置:
- 初始化
maxSum
为数组的第一个元素,currentSum
同样初始化为第一个元素。 - 初始化
start
和end
分别为0和0,它们将用于存储最大子数组的开始和结束位置。 - 初始化
tempStart
为0,它将用于临时保存可能的新子数组的开始位置。 - 使用一个循环遍历数组的其余部分(从第二个元素开始):
- 如果当前元素与前缀和之和小于当前元素本身,则重置
currentSum
为当前元素,并更新tempStart
为当前索引。 - 否则,将当前元素加入到
currentSum
中。 - 如果
currentSum
大于maxSum
,则更新maxSum
为currentSum
,并更新start
和end
为tempStart
和当前索引。
- 如果当前元素与前缀和之和小于当前元素本身,则重置
- 初始化
-
输出结果:
- 对于每个测试案例,输出 "Case i:",其中 i 是案例的编号。
- 然后输出最大子数组的和、起始位置和结束位置。注意,这里的位置是基于1的索引,所以需要加1。
- 如果这不是最后一个测试案例,输出一个空行以分隔不同的案例结果。
-
返回0:最后,函数返回0,表示程序正常结束。
HDU1004——Let the Balloon Rise
题目描述
运行代码
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
int N;
while (cin >> N && N != 0) { // Read until N == 0
map<string, int> colorCounts;
for (int i = 0; i < N; ++i) {
string color;
cin >> color;
colorCounts[color]++;
}
int maxCount = 0;
string mostPopularColor;
for (auto& entry : colorCounts) {
if (entry.second > maxCount) {
maxCount = entry.second;
mostPopularColor = entry.first;
}
}
cout << mostPopularColor << endl;
}
return 0;
}
代码思路
-
初始化变量:
N
:用于存储将要读取的颜色数量。colorCounts
:是一个std::map<std::string, int>
类型,用来存储每种颜色及其出现的次数。键是颜色名称(字符串),值是颜色出现的次数(整数)。
-
读取颜色数据:
- 使用
while
循环读取颜色数量N
,直到N
等于0为止,这通常作为文件或输入流结束的标志。 - 对于每一轮循环(即对于每组颜色数据),使用
for
循环读取N
个颜色字符串,并将其添加到colorCounts
映射中。如果颜色已经在映射中,那么其计数值会增加;如果颜色不在映射中,它会被添加到映射中,计数值初始化为1。
- 使用
-
查找最流行的颜色:
- 使用范围基的
for
循环遍历colorCounts
映射的每个条目。 - 在循环中,比较当前颜色的计数值与已记录的最大计数值
maxCount
。如果当前颜色的计数值大于maxCount
,则更新maxCount
为当前颜色的计数值,并将mostPopularColor
设置为当前颜色的名称。
- 使用范围基的
-
输出结果:循环结束后,
mostPopularColor
将包含出现次数最多的颜色。将该颜色的名称输出到标准输出流(屏幕)。 -
循环和退出条件:由于使用了
while
循环,程序会持续读取和处理颜色数据,直到遇到N
等于0的情况,此时循环结束,程序随之结束。