有会c++大哥吗?做一下这道题,不要use printf,scanf.

题目名称:高精度数减低精度数题目描述:输入一个高精度数和一个低精度数,(高精度数的数位不超过200)计算高精度数减去低精度数的差。样例输入:111111111111111... 题目名称:高精度数减低精度数
题目描述:输入一个高精度数和一个低精度数,(高精度数的数位不超过200)计算高精度数减去低精度数的差。

样例输入:
1111111111111111111
22
样例输出:
1111111111111111089
展开
 我来答
小黑哎啊
科技发烧友

2021-10-31 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:1642
采纳率:74%
帮助的人:360万
展开全部

/*

一般运算数位数超过19,就要考虑用高精度算法,就是用字符串输入,再用数组存储数位;

然后两个数组模拟数学运算,得出结果

高精度方面C/C++手写算法有儿复杂。

Java,Python,用专门的高精度运算方法,写起来精小强悍;

有兴趣可以了解一下

*/

#include<bits/stdc++.h>

using namespace std;

const int N = 2e4;

string s1, s2;

int cmp(string s1, string s2) { //判断大小

if (s1.length() > s2.length()) {

return 1;

} else if (s1.length() < s2.length()) {

return 2;

} else if (s1 == s2) {

return 0;

} else {

for (int i = s1.length(); i >= 0; i--) {

if (s1[i] > s2[i]) {

return 1;

}

}

return 2;

}

}

void sub(int a[],int b[],int &len){//大数相减 

int k=0;

int t=0;

for(int i=0;i<len;i++){//a-b 

a[i+1]--;

a[i]=10+a[i]-b[i]+t;

t=a[i]/10;

a[i]%=10;

}

for(int i=len-1;i>=0;i--){//求前导0的个数 

if(a[i]>0){

break;

}

k++;

}

len-=k;//减去前导0的位数 

}

void print(int a[],int len){//输出 

for(int i=len-1;i>=1;i--){

cout<<a[i];

}

}

void solve() {

int len1 = 0, len2 = 0;

int a[N] = {0}, b[N] = {0};

for (int i = s1.length(); i >= 0; i--) {

a[len1++] = s1[i] - '0';//字符串转化为数字数组

}

for (int i = s2.length(); i >= 0; i--) {

b[len2++] = s2[i] - '0';//字符串转化为数字数组

}

if (cmp(s1, s2) == 0) {//两个数相等 

cout << 0 << endl;

} else if (cmp(s1, s2) == 1) {//第一个数大 

sub(a,b,len1);//a-b 

print(a,len1);//打印结果 

} else if (cmp(s1, s2) == 2) {//第二个数大 

sub(b,a,len2);//b-a 

cout<<"-";//输出负号 

print(b,len2);//打印结果 

}

}

int main() {

cin >> s1 >> s2;//输入两个大数(以字符串的形式) 

solve();// 操作函数

return 0;

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式