高精度---小总结

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;
} 

 

posted @ 2019-06-19 22:20  Bankarian  阅读(185)  评论(0编辑  收藏  举报