根据逢十进一的规则,编程实现加法,用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
,否则返回true
。add
函数用于进行逢十进一加法,其实现思路是先找到两个字符串的小数点位置,并在没有小数点的位置添加上一个小数点,然后在小数点后面补零,使两个字符串的小数位数相等,然后从小数点往前遍历,按逢十进一的规则相加,最后把小数点插入到正确的位置,并去掉多余的零。main
函数中,先循环读入两个字符串,直到两个字符串都是数字为止,然后调用add
函数进行加法运算,并输出结果。注意,使用字符串进行逢十进一加法虽然可以保证多位小数的精度,但是效率比使用浮点数或双精度浮点数低。因此,在实际应用中,应根据需要选择合适的数据类型来进行计算。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 3
悬赏问题
- ¥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改写遇到的问题