關於大數(C語言)

浪極發表於2020-12-03

大數,即數字位數超乎想象(至少超乎long long想象)的數。因其位數過大,在c語言中不能對其進行直接運算;若想實現運算,則需要一些奇淫小技巧。

大數相加

兩數相加的手算操作:
將兩數右對齊,由右至左對位相加,結果上再加上一位的進位(如果有的話);保留該結果個位為這一位,再將多出的位數(也是如果有的話)進給下一位;反覆進行上述操作,直至兩數均消耗完。
懂的都懂,不懂的我也沒有辦法

模擬手算,即可實現大數相加

下面放程式碼

#include <stdio.h>

int main()
{
    char a[500], b[500];
    scanf("%s %s",a,b);//輸入
    int da = 0, db = 0;//用於錄每個數字的長度
    //將ascii碼轉換成數字
    int tmpa[500] = {0};
    for(int i = 0; a[i] != 0; i++)
    {
        tmpa[i+1] = a[i] - '0';
        da++;
    }
    for(int i = 1; i <= da; i++)
    {
        a[i] = tmpa[i];
    }
    int tmpb[500] = {0};
    for(int i = 0; b[i] != 0; i++)
    {
        tmpb[i+1] = b[i] - '0';
        db++;
    }
    for(int i = 1; i <= db; i++)
    {
        b[i] = tmpb[i];
    }
    //右對齊處理
    int d;//有效運算長度
    if(da > db)
    {
        d = da;
        int tmp[500] = {0};
        for(int i = d; i >= db - 1; i--)
        {
            tmp[i] = b[i - (da - db)];
        }
        for(int i = 1; i <= d; i++)
        {
            b[i] = tmp[i];
        }
    }
    if(db > da)
    {
        d = db;
        int tmp[500] = {0};
        for(int i = d; i >= da - 1; i--)
        {
            tmp[i] = a[i-(db-da)];
        }
        for(int i = 1; i <= d; i++)
        {
            a[i] = tmp[i];
        }
    }
    if(da == db) d = da;
    //模擬手算加法
    char c[510] = {0}, add = 0;
    for(int i = d; i > 0; i--)
    {
        int tmp = a[i] + b[i];
        c[i] = tmp % 10 + add;
        add = tmp / 10;
    }
    //輸出
    if(add != 0) printf("%d",add);
    for(int i = 1; i <= d; i++)
    {
        printf("%d",c[i]);
    }
}

大數相乘

學廢了大數相加,大數相乘不是so easy?即像手算乘法一樣,將第一個數的每一位與第二個數相乘,得到的一堆數進行合理的錯位相加,再處理一下進位即可。如圖:

為了簡化程式碼,我們也可以將兩個數的各位相乘,根據結果的位權進行錯位相加,再稍稍處理一下進位即可。如圖:在這裡插入圖片描述
程式碼實現:

#include <stdio.h>
#include <string.h>

int main()
{
    char a1[10001], b1[10001];
    int a[10001], b[10001], x, len, c[10001];
    //輸入
    gets(a1);
    gets(b1);
    int lena = strlen(a1);
    int lenb = strlen(b1);
    //將ascii碼轉換成數字
    for(int i = 1; i <= lena; i++)
    {
        a[i] = a1[lena-i] - '0';
    }
    for(int i = 1; i <= lenb; i++)
    {
        b[i] = b1[lenb-i]-'0';
    }
    //模擬手算乘法
	for(int i = 1; i <= lenb; i++)
    {
        for(int j = 1; j <= lena; j++)
        {
            c[i+j-1]+=a[j]*b[i];
        }
    }
    //結果處理
    for(int i = 1; i < lena + lenb; i++)
	{
        if(c[i] > 9)
	    {
		    c[i+1]+=c[i]/10;
		    c[i]%=10;
	    }
    }
    //判斷結果位數
	len = lena + lenb;
    while(c[len]==0 && len>1) 
    {
        len--;
    }
    //輸出
    for(int i = len; i >= 1; i--) 
    {
        printf("%d",c[i]);
    }
}

相關文章