高精度运算

概述

高精度算法是一种对于类似a+b problem,a*b problem等的 扩展;为什么这么说呐?是因为这两者有共同的目的:即实现数与数间的四则运算;但是我们都知道,在计算机运算中,是有其限制的——数大小的限制;但是,不可能任何时间都只是去让程序做一个较小范围的运算,故此,有大佬发明了高精度运算这一算法。怎么发明的呐?
在继续看下去之前,我劝你想一想
再继续向下看!!!

加法

试问,加法的核心思想是什么?
有如下这个式子:
这里写图片描述
它的核心就在于,同位数相加,然后进位,同位数相加,再加上进位值; 换成计算机语言就可以用数组来表达:
c数组存的是结果,a存的是第一个数的值,b存的是第二个数的值,x是进位。
注意,要先将x初始化为0!
大概的步骤如下:
**1.定义数组,字符串;
2.初始化数组为0;
3.输入数字,即正向代入到字符串;
4.反向代入到数组;
5.运算;
6.删除多的0;
7.反向输出结果;**

这就是加法的核心思想;下面就是高精度运算加法的程序:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
        int a[101], b[101], c[101], i, x, lena, lenb, lenc;
        char al[101], bl[101];
        memset(a, 0, sizeof(a));//初始化为0
        memset(b, 0, sizeof(b));
        memset(c, 0, sizeof(c));
        cin >> al; cin >> bl;
        lena = strlen(al);//取两个数的长度
        lenb = strlen(bl);
        for (i = 0; i <= lena - 1; i++) a[lena - i] = al[i]-48;
        for (i = 0; i <= lenb - 1; i++) b[lenb - i] = bl[i]-48;//翻转带入数组内
        lenc = 1; x = 0;//初始化定义
        while (lenc <= lena || lenc <= lenb) {
            c[lenc] = a[lenc] + b[lenc] + x;//核心思想
            x = c[lenc] / 10;//x是进位值,等于原来那个数除以10,不难理解吧,手动模拟一下
            c[lenc] %= 10;//都进位了,自然取余

        c[lenc] = x;
        if (c[lenc] == 0) lenc--;//若高位是0,就去0
        for (i = lenc; i >= 1; i--)
            cout << c[i];//反向输出,因为数组是反向被带入的
        cout << endl;
        return 0;
        }

减法

减法这个东西啊,和加法能有啥区别呐?
没错,还是那句话,先自己想想!!!

减法和其他程序不同的是:要判断所计算的数值的大小,进行比较;当然,在运算方面也有一些不同;

减法核心程序若此:

    #include<cstdio>   
    #include<cstring>  
    #include<iostream>  
    #include<algorithm>  
    using namespace std;  
    #define fil(a,b) memset(a,b,sizeof(a))  
    const int MAXN=10004;  
    struct None_Negative_Big_Number_Operate {  
        char s[2][MAXN];  
        int len[2];  
        void read() {  
            scanf("%s%s",s[0]+1,s[1]+1);  
            len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);  
        }  
        inline bool cmp() {  
            if (len[0]<len[1]) return 1;  
            if (len[0]>len[1]) return 0;  
            for (int i=len[0];i;--i) {  
                if (s[0][i]<s[1][i]) return 1;  
                if (s[0][i]>s[1][i]) return 0;  
            }  
            return 0;  
        }  
        void minus() {  
            int a[MAXN],b[MAXN],ans[MAXN];//x:被减数,y:减数  
            fil(a,0),fil(b,0);  
            for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';  
            for (int i=1;i<=len[1];++i) b[i]=s[1][len[1]-i+1]-'0';  
            bool bg=cmp();  
            int mxlen=max(len[0],len[1]);  
            for (int i=1;i<=mxlen;++i) {  
                int temp;  
                temp=(!bg)?a[i]-b[i]:b[i]-a[i];  
                if (temp<0) ans[i]=temp+10,(!bg)?--a[i+1]:--b[i+1];  
                else ans[i]=temp;  
            }  
            while (!ans[mxlen]&&mxlen) --mxlen;  
            if (!mxlen) {puts("0");return ;}  
            if (bg) printf("-");  
            while (mxlen) printf("%d",ans[mxlen--]);  
            puts("");  
        }  
        }bn;  
        int main() {  
            bn.read();  
            bn.minus();  
            return 0;  
            }  

乘法:

核心思想:

string mul(string &a,string &b)
{
    int len = a.length() + b.length();
    string c(len,0);

    for(int i=0;i<a.length();i++)
    {
        for(int j=0;j<b.length();j++)
        {
            c[i+j] += a[i] * b[j];
            c[i+j+1] += c[i+j]/10;
            c[i+j] %= 10;
        }
    }

代码:

#include  <cstdio> 
using namespace std;
int main() 
{ 
  int  a[240] = {0}, b[240] = {0}, c[480] = {0}; 
  int  i, j, ka, kb, k; 
  char  a1[240], b1[240]; 
  gets(a1);    
  ka = strlen(a1); 
  gets(b1);    
  kb = strlen(b1); 
  k = ka + kb; 
  for(i = 0; i < ka; i++)  a[i] = a1[ka-i-1] - '0'; 
  for(i = 0; i < kb; i++)  b[i] = b1[kb-i-1] - '0'; 
  for(i = 0; i < ka; i++) 
    for(j = 0; j < kb; j++) 
    { 
      c[i + j] = c[i + j] + a[i] * b[j]; 
      c[i + j +1] = c[i + j +1] + c[i + j]/10; 
      c[i + j] = c[i + j] % 10; 
    } 
  if(!c[k])  k--; 
  for(i = k-1; i >= 0; i--)  printf("%d", c[i]);        
}     

好啦,高精度就讲到这里了,有疑问的可以找我,我的qq:1783841479;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值