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 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题