根据逢十进一的规则,编程实现加法,用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 爬取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 人在外地出差,速帮一点点