目录
HDU1062——Text Reverse
题目描述
运行代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int t;
cin >> t;
cin.ignore(); // 忽略换行符
while (t--) {
string s;
getline(cin, s);
string word;
string result;
for (char c : s) {
if (c == ' ') {
std::reverse(word.begin(), word.end());
result += word + " ";
word = " ";
}
else {
word += c;
}
}
reverse(word.begin(), word.end());
result += word;
cout << result << endl;
}
return 0;
}
代码思路
-
首先,读取测试用例的数量
t
。 -
进入一个
while
循环,根据t
的值执行相应次数的操作。 -
在每次循环中:
- 使用
getline
函数读取一行字符串s
。 - 初始化两个空字符串
word
和result
。word
用于临时存储正在构建的单词,result
用于存储最终反转单词后的结果。 - 遍历输入的字符串
s
中的每个字符c
:如果字符是空格,说明一个单词结束。将当前word
反转,并添加到result
后面,同时加上一个空格。然后将word
重置为空。如果字符不是空格,将其添加到word
中。 - 循环结束后,单独处理最后一个单词,将其反转并添加到
result
中。
- 使用
-
输出处理后的结果字符串
result
。
HDU1063——Exponentiation
题目描述
运行代码
#include <cstdio>
#include <string>
const int MAX = 150;
const int READ = 7;
// 定义一个结构体表示数字,包含数字数组和长度
struct digit
{
int m_nNumber[MAX];
int m_nLength;
};
/**
* @brief 执行两个数字结构体的乘法操作
*
* @param lhd 左操作数
* @param rhd 右操作数
* @param result 存储乘法结果
*/
void multiply(const digit& lhd, const digit& rhd, digit& result)
{
int i = 0, j = 0, k = 0;
// 计算两个自然数乘积的最大可能位数,等于两个数位数之和或比其少 1
result.m_nLength = lhd.m_nLength + rhd.m_nLength;
// 初始化结果数组为 0
for (i = 0; i < result.m_nLength; ++i)
{
result.m_nNumber[i] = 0;
}
// 逐位进行乘法运算
for (i = 0; i < rhd.m_nLength; ++i)
{
for (j = 0; j < lhd.m_nLength; ++j)
{
// 积的某位等于两数对应位的乘积之和
result.m_nNumber[i + j] += rhd.m_nNumber[i] * lhd.m_nNumber[j];
}
}
// 处理进位
for (i = 0; i < result.m_nLength - 1; ++i)
{
if (result.m_nNumber[i] >= 10)
{
result.m_nNumber[i + 1] += result.m_nNumber[i] / 10;
result.m_nNumber[i] %= 10;
}
}
// 如果积的最高位为 0,缩短长度
if (0 == result.m_nNumber[i])
{
--result.m_nLength;
}
}
/**
* @brief 主函数
*
* @param argc 命令行参数个数
* @param argv 命令行参数数组
* @return int 程序返回值
*/
int main(int argc, const char* argv[])
{
char sz[READ] = { 0 };
int nPower = 0;
while (scanf_s("%s%d", sz, &nPower)!= EOF) // 不断读取输入
{
std::string str = sz;
// 去掉输入字符串的前导零
str = str.substr(str.find_first_not_of("0"), str.size());
if (str.find(".")!= std::string::npos) // 如果是小数形式
{
// 去掉小数部分后面的零
while (*str.rbegin() == '0')
{
str.erase(str.size() - 1);
}
}
// 记录小数的位数
int nDecimalBits = 0;
if (str.find(".")!= std::string::npos)
{
nDecimalBits = str.size() - (str.find(".") + 1);
}
// 将字符串转化为数字结构体
digit lhd = { {0}, 0 };
for (int i = str.size() - 1; i >= 0; --i)
{
if (str[i]!= '.')
{
lhd.m_nNumber[lhd.m_nLength++] = str[i] - '0';
}
}
if (0 == nPower) // 计算 0 次幂
{
printf("1\n");
}
else if (1 == nPower) // 计算 1 次幂,直接输出
{
if (*str.rbegin() == '.')
{
str = str.substr(0, str.size() - 1);
}
printf("%s\n", str.c_str());
}
else // 计算多次幂
{
digit rhd = { {0}, 0 }, result = { {0}, 0 };
multiply(lhd, lhd, rhd); // 先计算二次幂
for (int i = 3; i <= nPower; ++i)
{
// 交替使用两个临时变量存储乘数和结果
if (i % 2 == 1)
{
multiply(rhd, lhd, result);
}
else
{
multiply(result, lhd, rhd);
}
}
// 结果存储在 rhd 中(根据幂次奇偶性)
if (nPower % 2 == 0)
{
for (int i = 0; i < rhd.m_nLength; ++i)
{
result.m_nNumber[i] = rhd.m_nNumber[i];
}
result.m_nLength = rhd.m_nLength;
}
// 输出结果
if (0 == nDecimalBits) // 如果没有小数部分
{
for (int i = result.m_nLength - 1; i >= 0; --i)
{
printf("%d", result.m_nNumber[i]);
}
printf("\n");
}
else if (nDecimalBits * nPower <= result.m_nLength) // 小数位在数字中间或开头
{
for (int i = result.m_nLength - 1; i >= 0; --i)
{
if (i == nDecimalBits * nPower - 1)
{
printf(".%d", result.m_nNumber[i]);
}
else
{
printf("%d", result.m_nNumber[i]);
}
}
printf("\n");
}
else // 小数位多于数字的位数
{
printf(".");
for (int i = 0; i < nDecimalBits * nPower - result.m_nLength; ++i)
{
printf("0");
}
for (int i = result.m_nLength - 1; i >= 0; --i)
{
printf("%d", result.m_nNumber[i]);
}
printf("\n");
}
}
}
return 0;
}
代码思路
-
首先定义了一个结构体
digit
来表示数字,包含数字的数组和长度。 -
multiply
函数用于计算两个digit
结构体表示的数字的乘积,并将结果存储在第三个digit
结构体中。通过逐位相乘、处理进位和调整结果长度来实现。 -
在
main
函数中:- 不断读取输入的数字字符串和幂次。
- 对输入字符串进行处理,去掉前导零和小数部分后面的零,并记录小数位数。
- 将输入字符串转换为
digit
结构体表示。 - 根据幂次进行计算:0 次幂输出 1 。1 次幂直接输出转换后的数字。多次幂通过循环和
multiply
函数计算,并根据小数位数的情况进行输出。 - 输出结果时,考虑小数位数与数字长度的关系,以正确的格式输出。
HDU1064——Financial Management
题目描述
运行代码
#include <iostream>
#include<iomanip>
using namespace std;
int main() {
double balance, total = 0;
for (int i = 0; i < 12; ++i) {
cin >> balance;
total += balance;
}
double average = total / 12;
cout << "$" << fixed << setprecision(2) << average << endl;
return 0;
}
代码思路
-
定义了两个双精度浮点数
balance
和total
,其中balance
用于临时存储每次输入的月余额,total
用于累计所有月的余额,初始化为 0 。 -
使用一个
for
循环,循环 12 次,每次读取一个月的余额并存入balance
,然后将其累加到total
中。 -
计算所有余额的平均值,将总和
total
除以 12 ,结果存储在average
中。 -
使用
cout
输出平均值。首先输出美元符号$
,然后通过fixed
和setprecision(2)
控制输出格式,确保以固定小数位(两位)的形式输出平均值average
,最后输出换行符endl
。 -
程序返回 0 ,表示正常结束。