高精度除法我是死活写不出来了
前言:高精度的基本思路就是模拟竖式大家都知道吧(求助电话:高精度计算),想必你看到这,应该明白了加法和乘法了,那么,减法有什么区别呢,主要是需要判断结果是否为负以及借位;
在这两点上,既然你会进位,就一定会借位,故单独说一下负数的问题:-(b-a)=-b+a=a-b
你明白了吗?
题目:洛谷P2142
代码:
1 /* 2 万恶的高精度之减法 3 这个基本思路和加法一样,字符读取,倒叙存储等 4 但是注意,对于减法,还要考虑结果为负的情况 5 */ 6 #include<iostream> 7 #include<cstdio> 8 #include<cstring> 9 using namespace std; 10 int main(){ 11 char a[10050],b[10500]; 12 bool fu=0;//判断结果是否为负 13 scanf("%s%s",a,b); 14 int s1=strlen(b); 15 int s=strlen(a); 16 int a1[100000],b1[100000],c[100000]; 17 {//判断结果是否为负 18 if(strlen(b)>strlen(a)) 19 { 20 fu=1;//都比第一个长了还不必第一个大? 21 } 22 else 23 if(s1==s) 24 { 25 int k=1;//苦逼的一位一位判断 26 while(k<=s){ 27 if(a[k]<b[k]) 28 { 29 fu=1; 30 break; 31 } 32 k++; 33 } 34 } 35 } 36 if(fu) 37 { 38 char d[10000]; 39 strcpy(d,a); 40 strcpy(a,b); 41 strcpy(b,d); 42 cout<<"-"; 43 //交换值,输出负号 44 } 45 s1=strlen(b); 46 s=strlen(a); 47 for(int i=1;i<=s;++i) 48 { 49 a1[i]=int(a[s-i]-'0'); 50 } 51 52 for(int i=1;i<=s1;++i) 53 { 54 b1[i]=int(b[s1-i]-'0'); 55 }//倒叙存储 56 s=max(s,s1);//事实上没必要 ,我们已经保证了s/a 最长 57 for(int i=1;i<=s1;++i) 58 { 59 if(a1[i]<b1[i]) 60 { 61 a1[i+1]--;//借位处理 62 a1[i]+=10; 63 } 64 c[i]=a1[i]-b1[i]; 65 } 66 s1++; 67 while(c[s1]==0) s1--;//去前导零 68 if(s1<=0) 69 cout<<0;//特判,如果两数相等,事实上也可以写在前面 70 for(int i=s1;i>=1;--i) 71 cout<<c[i]; 72 //倒序输出 73 return 0; 74 }
记得点个赞,谢谢了;
特别是你也喜欢MIKU||二次元的话)
THAT'S ALL;