上午篇
一、高精度计算;
【以下内容先只考虑非负数情况】
•高精度加法:
思路:【模拟竖式运算】
注意:【进位】
•高精度减法:
思路:【同加法类似,模拟竖式运算,进位变退位】
注意: 【结果为负数的情况(一会儿讲到)】
•高精度乘法:
思路:【类似,模拟竖式运算,考虑进位】
注意:【结果为0的情况】
附总代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; char str[1000]; int a[1000],b[1000],c[1000]; int main(){ scanf("%s", str); int len=strlen(str); // '36' for(int i=len-1;i>=0;i--)a[len-i]=str[i]-'0'; // scanf("%s", str); int n=len; /*len=strlen(str); // '36' for(int i=len-1;i>=0;i--)b[len-i]=str[i]-'0'; int m=len;//将数字转成字符串输入 n=max(n,m);*/ //for(int i=1;i<=n;i++)c[i]=a[i]...b[i];//...处为运算符号 /*for(int i=1;i<=n;i++){ c[i+1]+=c[i]/10; c[i]%=10;//模拟进位,以下被注释掉的大多也一样; }*/-----高精加法部分 /*for(int i=1;i<=n;i++) if(c[i]<0){ c[i]+=10; c[i+1]-=1; } while(c[n]==0)n-=1;*/-----高精减法部分 /*for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) c[i+j-1] += a[i]*b[j]; for(int i=1;i<=n+m-1;i++){ c[i+1]+=c[i]/10; c[i]%=10; } n=n+m-1; while(c[n+1]>0)n+=1;*/-----高精乘法部分 /*int B; cin>>B; cout<<B<<endl; for(int i=n;i>0;i--){ c[i]=a[i]/B; a[i-1]+=(a[i]%B)*10; } while(c[n]==0 && n>0)n--;*/-----高精除以低精部分 for(int i=n;i>0;i--)printf("%d",c[i]); }
•那么,负数怎么办呢?
其实可以分三种
(1)加法:
一个数是负数:变为减法;
两个数是负数:全部变成正数算加法,最后取负;
(2)减法:
被减数是负数:全部变为正整数算加法,最后取负
减数是负数:减数取负,变为加法
都是负数:都取负,变为减法,即(-减数)-(-被减数)
(3)乘除法:
统计负数个数s
都变为非负数计算,若s为奇数,最后取负
二、模意义下运算