HDU1062——Text Reverse,HDU1063——Exponentiation,HDU1064——Financial Management

目录

HDU1062——Text Reverse

题目描述

运行代码

代码思路

HDU1063——Exponentiation

题目描述

运行代码

代码思路

HDU1064——Financial Management

题目描述

运行代码

代码思路

HDU1062——Text Reverse

题目描述

Problem - 1062

运行代码

#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;
}

代码思路

  1. 首先,读取测试用例的数量 t 。

  2. 进入一个 while 循环,根据 t 的值执行相应次数的操作。

  3. 在每次循环中:

    • 使用 getline 函数读取一行字符串 s 。
    • 初始化两个空字符串 word 和 result 。word 用于临时存储正在构建的单词,result 用于存储最终反转单词后的结果。
    • 遍历输入的字符串 s 中的每个字符 c :如果字符是空格,说明一个单词结束。将当前 word 反转,并添加到 result 后面,同时加上一个空格。然后将 word 重置为空。如果字符不是空格,将其添加到 word 中。
    • 循环结束后,单独处理最后一个单词,将其反转并添加到 result 中。
  4. 输出处理后的结果字符串 result 。

HDU1063——Exponentiation

题目描述

Problem - 1063

运行代码

#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;
}

代码思路

  1. 首先定义了一个结构体 digit 来表示数字,包含数字的数组和长度。

  2. multiply 函数用于计算两个 digit 结构体表示的数字的乘积,并将结果存储在第三个 digit 结构体中。通过逐位相乘、处理进位和调整结果长度来实现。

  3. 在 main 函数中:

    • 不断读取输入的数字字符串和幂次。
    • 对输入字符串进行处理,去掉前导零和小数部分后面的零,并记录小数位数。
    • 将输入字符串转换为 digit 结构体表示。
    • 根据幂次进行计算:0 次幂输出 1 。1 次幂直接输出转换后的数字。多次幂通过循环和 multiply 函数计算,并根据小数位数的情况进行输出。
    • 输出结果时,考虑小数位数与数字长度的关系,以正确的格式输出。

HDU1064——Financial Management

题目描述

Problem - 1064

运行代码

#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;
}

代码思路

  1. 定义了两个双精度浮点数 balance 和 total ,其中 balance 用于临时存储每次输入的月余额,total 用于累计所有月的余额,初始化为 0 。

  2. 使用一个 for 循环,循环 12 次,每次读取一个月的余额并存入 balance ,然后将其累加到 total 中。

  3. 计算所有余额的平均值,将总和 total 除以 12 ,结果存储在 average 中。

  4. 使用 cout 输出平均值。首先输出美元符号 $ ,然后通过 fixed 和 setprecision(2) 控制输出格式,确保以固定小数位(两位)的形式输出平均值 average ,最后输出换行符 endl 。

  5. 程序返回 0 ,表示正常结束。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值