大數乘法c語言
㈠ c語言鏈表如何求50階乘和
計算50的階乘需要使用大數演算法,因為50的階乘結果非常大,無法直接用標准數據類型存儲。具體實現時,可以使用一個數組來存儲每一位的數值。以下是一個簡單的C語言實現示例:
首先定義一個整數數組a,用於存儲階乘的結果,數組大小至少需要9000位,以確保能夠存儲50的階乘結果。
初始化數組a[0]為1,表示階乘的初始值為1。
從2開始遍歷到50,依次將每個數與當前的臨時結果相乘。這里的關鍵在於如何處理乘法和進位。具體步驟如下:
對於每個階乘元素i,從數組a的首位開始,逐位乘以i,並加上當前的進位。計算結果的每一位,並更新進位。
如果當前位乘法後有進位,則需要將進位加到下一位的乘積中。
如果在乘法過程中產生了新的進位,需要將新的進位值存儲到數組的更高位,並增加位數。
最後,將結果數組a中的每一位逆序輸出,即可得到50的階乘。
需要注意的是,實際操作時,要確保數組的大小足夠大,以容納所有可能的進位和乘積。
此外,輸出時需要從高位到低位輸出數組a中的每一位,以得到正確的階乘結果。
這種方法雖然可以准確計算出50的階乘,但處理大量數據時可能會比較耗時。在實際應用中,還可以考慮使用更高效的演算法或數據結構來優化計算過程。
㈡ c語言大整數乘法
dc這個函數裡面連b這個參數都沒有使用,這也能出結果...,
if(z[0]='0')continue 也寫錯了
不是打擊你,你的代碼太濫了,實在不想去找錯誤,給你我以前寫的代碼吧,你自己整理一下
#include <stdio.h>
int mulx(char * a,int b,char * r,int d);
void init(char * s);
char buf1[4*1024];
char buf2[4*1024];
char buf3[4*1024];
int main()
{
char * a;
char * b;
char * r;
char * t;
int d;
int i;
a = buf1;
b = buf2;
r = buf3;
init(NULL);
while(scanf("%s %d",a,&d)!=EOF)
{
mulx(a,d,r,10);
printf("%s\n",r);
}
return 0;
}
char c2d[256]; //字元轉換成數字
char * charset; //代表數字的字元
/*功能:設置使用那些字元表示數字,默認的為"0123456789ABCDEF"*/
/*參數:*/
/*返回值:*/
void init(char * s)
{
int i;
if(s==NULL)
charset = "0123456789ABCDEF";
else
charset = s;
for(i=0;i<256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}
/*功能:清除前導零*/
/*參數:需要清楚的數字*/
/*返回值:清零後數字的位數*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[i];i++,j++)
a[j] = a[i];
a[j] = 0;
if(j==0)
{
a[j++] = charset[0];
a[j] = 0;
}
return j;
}
/*功能:乘,用於進制轉換之類*/
/*參數:a 和 b 分別為乘數,結果保存到 r , d 為使用的進制*/
/*注意:r 可以等於 a , b一定要小於d, 如果被乘數有前導0 則結果也會有前導0*/
/*返回值:結果的位數*/
int mulx(char * a,int b,char * r,int d)
{
int i,j,k,len;
int c,t;
if(r==NULL)
r = a;
for(i=0;a[i];i++);
len = k = i;
for(c=0,i--,r[k--]=0;i>=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i>=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}
㈢ C語言怎麼計算大數階乘的結果的位數
#include<cstdio>
#include<cmath>
#definepi3.14159265
#definee2.718281828
intmain()
{
intn,num;//所求為n!的位數,num為位數
scanf("%d",&n);
if(n==0)
{
num=1;
}
else
{
num=(int)((0.5*log(2*pi*n)+n*log(n)-n)/log(10))+1;
}
printf("%d",num);
}
使用斯特林公式,n!約等於sqrt(2*pi*n)*(n/e)^n,如不理解需更多信息或者有使用高精度(long long不夠)的需求繼續追問
㈣ 我想問一下用C語言寫大數乘法有什麼方法可以計算呢可以由什麼想這個計算的方法!
大數乘法基本上是乘法豎式筆算的代碼化。
基本功能有3個
大數的數組表示。
大數乘以小數,得到大數。
大數加大數,得到大數。
對於1,其實就是int數組的每個元素存儲若干位。比如每個元素保存4個十進制位。[0]存儲個十百千,[1]存儲萬、十萬、百萬、千萬,諸如此類。一個數組保存一個大數。因此需要一個額外的int變數記錄當前數組用了多少個元素(類似於字元串長度)。
對於2,「小數」指的是能用一個int保存的數。注意這里只限4個二進制位(和1里提到的位數一致)。
比如1 2345 6789這個數字,[0]保存6789,[1]保存2345,[2]保存1。長度3。
這個大數乘以小數,比如9999,過程就是[0] * 9999,即6789 * 9999 = 6788 3211,積的低四位(%10000)3211保存到積(大數)的[0],剩下6788的進位到[1]。
然後2345 * 9999 =2344 7655,加上剛才進位上來的6788得到2345 4443,其中4443保存到積(大數)的[1]中,2345進位到[2]。
以此類推。
對於3,基本只要一個for,對位相加然後注意進位就行了。
大數乘以大數,其實就是第一個大數先乘以第二個大數的[0](大數乘小數,上面的2),得到一個大數A0;然後第一個大數乘以第二個大數的[1],又得到一個大數A1……最後再將A0、A1、……加起來(也就是大數加法,上面的3)。加的時候要注意,A1的[0]要和A0的[1]對齊,A2的[0]要和A1的[1]和A0的[2]對齊……這個也和我們豎式筆算一樣。
PS:上面的演算法基本上是「10000進制數」的計算方式。如果數組的每個元素只保存1個十進制位,那就是10進制數。之所以用10000進制,純粹是程序員感覺上好一些。最有效的利用,是每個int保存2的15次方,也就是32768進制。要注意到,如果用10進制計算的話,程序的計算耗時會變成10000進制的16倍,也就是效率變成1/16。
PS2:用int數組的話,位數最多隻能是4位。因為5位數相乘可能得到11位數,超出了int表示範圍。
㈤ c語言大整數乘法
#include<stdio.h>
#include<string.h>
void chengfa(char *a,char*b)
{
char c[10000];
int fuhao1,fuhao2;
if(a[0] == '-' || a[0] == '+') {
if(a[0] == '-')
fuhao1 = -1;
else fuhao1 = 1;
strcpy(c,a+1);
strcpy(a,c);
}
if(b[0] == '-' || b[0] == '+') {
if(b[0] == '-')
fuhao2 = -1;
else fuhao2 = 1;
strcpy(c,b+1);
strcpy(b,c);
}
int i , j;
for(i = 0; i< 10000;i++){
c[i] = '鄭衫0';
}
int lena = strlen(a);
int lenb = strlen(b);
for(i = lena-1;i >=0;i--){
int k = 0;
for(j = lenb-1;j >=0;j--) {
char l = c[i+j+1];
c[i+j+1] = (c[i+j+1]-'0'+(b[j]-'0')*(a[i]-'0')+k)%10+'0';
k = (l-'0'+(b[j]-'0') * (a[i] -'0')+k)/10;
}
if(k!= 0) c[i] += k;
}
i = 0;
j = 0;
while(c[i] == '0') i++;
while(i <= lena+lenb-1) {
a[j] = c[i];
j ++;
i ++;
}
a[j] = '銷逗\0';
if(a[0] == '\0') a[0] = '0',a[1] = '\0';
if(fuhao1*fuhao2 == -1 && a[0] !='0') {
strcpy(c,a);
a[0] = '-';
a[1] = '\0';
strcat(a,c);
}
}
int main()
{
char a[10000],b[10000];
while(scanf("%s %s",a,b) == 2) {
chengfa(a,b);
printf("%s\喊斗腔n",a);
}
}
/*
//測試數據
3 4
12
1782362317836127863178 5
8911811589180639315890
2364782367834627864826 23478962483263478
*/