m0_74320701 2023-04-16 10:03 采纳率: 100%
浏览 197
已结题

C++编程,逢十进一加法

根据逢十进一的规则,编程实现加法,用float,double定义时,多位小数精度丢失,如果采用字符串存储,且能输出超过6位的小数,用户输入的字符串非数字时直接结束程序,应该怎么编写,

  • 写回答

8条回答 默认 最新

  • Zyb0627 2023-04-16 16:39
    关注

    引用chatGPT作答,以下是使用字符串实现逢十进一加法的C++代码:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // 检查输入字符串是否为数字
    bool isNumber(const string& s) {
        for (char c : s) {
            if (!isdigit(c) && c != '.' && c != '-') {
                return false;
            }
        }
        return true;
    }
    
    // 逢十进一加法
    string add(string s1, string s2) {
        // 找到两个字符串小数点的位置
        int p1 = s1.find('.');
        int p2 = s2.find('.');
        // 如果s1没有小数点,则在末尾添加一个小数点
        if (p1 == string::npos) {
            s1 += '.';
            p1 = s1.size() - 1;
        }
        // 如果s2没有小数点,则在末尾添加一个小数点
        if (p2 == string::npos) {
            s2 += '.';
            p2 = s2.size() - 1;
        }
        // 找到两个字符串小数点后面的数字长度
        int len1 = s1.size() - p1 - 1;
        int len2 = s2.size() - p2 - 1;
        // 在长度不足的小数后面补零,使它们的长度相等
        if (len1 < len2) {
            s1.append(len2 - len1, '0');
        } else if (len1 > len2) {
            s2.append(len1 - len2, '0');
        }
        // 对齐后的小数位数
        int len = max(len1, len2);
        // 进位标志
        bool carry = false;
        // 从小数点往前遍历,按逢十进一的规则相加
        for (int i = len - 1; i >= 0; i--) {
            // 如果当前位是小数点,则跳过
            if (i == p1 || i == p2) {
                continue;
            }
            // 计算当前位的数字和
            int sum = (s1[i] - '0') + (s2[i] - '0') + (carry ? 1 : 0);
            // 如果和大于等于10,则需要进位
            if (sum >= 10) {
                carry = true;
                sum -= 10;
            } else {
                carry = false;
            }
            // 把当前位的和转成字符并存储到s1中
            s1[i] = sum + '0';
        }
        // 如果最高位有进位,则在整数部分添加1
        if (carry) {
            s1.insert(0, "1");
        }
        // 把小数点插入到正确的位置
        s1.insert(s1.size() - len, ".");
        // 去掉字符串末尾多余的零
        while (s1.back() == '0') {
            s1.pop_back();
        }
        // 如果小数点后面没有数字,则去掉小数点
        if (s1.back() == '.') {
            s1.pop_back();
        }
        return s1;
    }
    
    int main() {
        string s1, s2;
        cout << "
    // 循环读入两个字符串,直到两个字符串都是数字为止
    while (true) {
        cout << "请输入第一个数:";
        getline(cin, s1);
        if (isNumber(s1)) {
            break;
        }
        cout << "输入错误,请重新输入!" << endl;
    }
    while (true) {
        cout << "请输入第二个数:";
        getline(cin, s2);
        if (isNumber(s2)) {
            break;
        }
        cout << "输入错误,请重新输入!" << endl;
    }
    // 调用逢十进一加法函数并输出结果
    string result = add(s1, s2);
    cout << "结果为:" << result << endl;
    return 0;
    
    

    这段代码中,isNumber函数用于检查一个字符串是否为数字,其实现思路是遍历字符串中的每个字符,如果不是数字、小数点或负号,则返回false,否则返回trueadd函数用于进行逢十进一加法,其实现思路是先找到两个字符串的小数点位置,并在没有小数点的位置添加上一个小数点,然后在小数点后面补零,使两个字符串的小数位数相等,然后从小数点往前遍历,按逢十进一的规则相加,最后把小数点插入到正确的位置,并去掉多余的零。main函数中,先循环读入两个字符串,直到两个字符串都是数字为止,然后调用add函数进行加法运算,并输出结果。

    注意,使用字符串进行逢十进一加法虽然可以保证多位小数的精度,但是效率比使用浮点数或双精度浮点数低。因此,在实际应用中,应根据需要选择合适的数据类型来进行计算。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 4月24日
  • 已采纳回答 4月16日
  • 修改了问题 4月16日
  • 修改了问题 4月16日
  • 展开全部

悬赏问题

  • ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点