c語言之大數基本運算

2021-08-20 14:38:18 字數 3358 閱讀 8287

今天我想給大家介紹有關大數運算的方法,大數這裡可以算是乙個難點同樣也是重點,以下的**只針對非負數,大家在看之前可以自己思考一下。

考慮到整型變數的範圍有限,所以我們用字元陣列來定義輸入的兩個大數,首先要使它們相應的位對齊,位數少的在前補0,然後各個位數的相加要考慮到進製,這裡我定義為s。下面是全部**:

#include"stdio.h"#include"string.h"intmain()

c[50

-1-m]=s+'0';

printf("%s",c);

}

這裡需要注意的是:大數用的是字元儲存,不能直接相加,要先將其轉化成數字再進行運算。

emmm,我這裡沒有去掉前導0。

階乘和加法的原理一樣都是相應的位進行運算然後要考慮到進製,這裡我宣告了乙個自定義函式來計算階乘,切記不要忽略了特殊情況。

#include"stdio.h"#include"string.h"voidprint_factorial(intn)

//階乘的函式

elseif(n==0)

inta[100000]=,i,j;intt=0,len=1,tem;//t為進製,len為位數

for(i=2;i<=n;i++)

}for(i=len-1;i>=0;i--)

}intmain()

這裡需要注意的是:a陣列是逆著存最後的結果的,所以輸出時需要逆序輸出。

這裡我來舉兩個特殊的例子:計算3的100次方和浮點數的冪,其實高階冪的演算法和階乘一樣,只是部分地方需要改動,你只要理解了最核心的**就問題不大。以下是3的100次方的**:

#include"stdio.h" 

#include"string.h"

int main()

,i,j,t,tem,len=1;

char b[1000],c[1000];

gets(b);

for(i=1;i<=100;i++)//計算3^100

}//逆著存的

j=0;

for(i=len-1;i>=0;i--)

printf("%d",a[i]);//輸出結果

printf("\n");

}

同樣注意的是,這裡也是逆序輸出哦~

我們再來看一下浮點數的高階冪,它比整數要複雜的多,我們來看一下這種題的要求:

本題中需要注意的點:

1.先找到小數點的位置,紀錄並去掉。

2.去掉無意義的0。

3.紀錄小數點後有效位的位數。

4.每次計算中都要去除無意義的0。

5.計算最後結果中小數點的位置。

6.將小數點加入到計算結果中。

7.去掉最終結果中的無意義的0並輸出。

例如:

輸入:95.123 12

輸出:548815620517731830194541.899025343415715973535967221869852721

完整**如下:

#include"stdio.h"#include"string.h"intlen=1;voidmultiply(inta,intn,intnum)

}//逆著存的

}intmain()

; num=0,t=0;for(i=0;i

else

} multiply(a,n,num);if(len<=t)//陣列a的位數小於小數字數

else

l=len;for(i=len-1;i>=j;i--)//去掉前導0

for(i=l-1;i>=j;i--)

}printf("\n");

} }

上面這個題比較複雜,要考慮的問題比較多,所以**寫起來比較繁瑣,希望大家不會的可以好好琢磨一下,試著自己敲出來。

這是我認為這裡面最難的一種運算,它是階乘和加法的結合,首先我們要搞清楚多位數與多位數相乘的原理和過程並從中發現規律。

其核心就是:兩個大數,從末尾開始逐位相乘。相乘結果儲存在另外乙個陣列裡面(也從陣列末尾開始依次往前儲存)。然後將儲存位置大於9的數進行進製處理。

為了便於理解舉個例子:

我們通過舉例可以發現相乘後的位數k不會超過m+n;這樣我們在寫**時就便利不少。

以下是完整**:

#include#include#include#define m 10005chars1[m],s2[m],s[m];inta[m],b[m],c[m];intmain()  

} //去除前導0

i=k;while(c[i]==0) i--;

//判斷兩個非負數之積是否為0,以及逆序列印cif(i<0) printf("0");else

printf("\n");

}return0;

}

先介紹這幾種大數的基本演算法,還有大數減法和大數除法我沒有提,大家可以下去好好想想,掌握了這些你在大數方面的演算法題就沒啥大問題。

大數運算之大數加法(C )

眾所周知,加法運算是小學一年級的學生就懂的知識點。即從兩個數個位開始,按位相加,逢十進一。對於懂得c 的你而言,so so so easy 只需要利用加法運算子即可 但若你要處理的數值位數十分巨大,如兩個位數為20的數相加。在紙上進行運算十分簡單,但在c 中直接使用加法運算子卻無法實現你的預期,這是...

c語言面試題之大數運算

請使用 計算 1234567891011121314151617181920 2019181716151413121110987654321 include iostream include algorithm include stdio.h include string h using names...

大數運算之大數相減

大數減法運算 第一次在csdn寫部落格,督促自己不斷學習 鞏固和進步,希望能和大家一起成長 在程式設計實現整數運算時,作為程式猿 媛,我們知道計算機中的int long或者long long的所佔的記憶體空間是有限的,當整數超過一定大小,這些型別就無法表示整數的值,否則資料會被 截斷 無法得到正確的...