1)存数数组:存储大数一般考虑从最低位开始存起,即位数越高,所在位置越后。数组0位用来存小数点后一位,需要时可以方便判断四舍五入。
2)multi乘法:模拟乘法,从最低位开始乘,利用临时变量存储进位。该位先存进位再取模。
3)divis除法:模拟除法,从最高位开始除,余数*10加到下一位。若要考虑最终结果四舍五入,要回溯检查。记得去前导零。
4)subtr减法:这里先只考虑简单的大减小(即结果为正数)。取更小的长度从最低位开始对应相减,结果为负则向前借位。记得去前导零。
5)plus加法:从最小位开始加,该位先存进位再取模
#include <iostream> //高精度 using namespace std; #define ll long long ll s[10005]={0,1}; //若是一直累乘,没有除法来影响原数组,可用s[0]当len使用 int len=0; ll a=0,b=0; //高精度加法 void add(ll s[],ll u) { int x=0,i=1; s[1] += u; // cout<< s[1]<<endl; while(s[i]>9){ x = s[i]/10; s[i] %= 10; s[++i] += x; } while(s[len+1]) len++; } //高精度乘法 void multi(ll s[],ll u) { int i=1,x=0; //x存进位 s[1] *= u; //从最低位开始乘 while(s[i]>9){ len++; //位数增加 x = s[i]/10; s[i] %= 10; s[i+1] = s[i+1]*u+x; ++i; } while(len && !s[len]) len--; //去前导零 } //高精度除法 void divis(ll s[],ll u) { for(int i=len;i;--i) { s[i-1] += (s[i]%u)*10; s[i] /= u; } //若要四舍五入 // if(s[0]/u>4) ++s[1]; while(len && !s[len]) len--; //去前导零 } int main() { cin>> a>> b; multi(s,a);//将a转化成为大数 multi(s,b); // divis(s,13) ; add(s,1293939); for(int i=len;i;--i) cout<<s[i]; cout<<endl; return 0; }
。