您好,登錄后才能下訂單哦!
這篇文章主要介紹C語(yǔ)言中字符串相乘的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
示例:
我們把每一個(gè)數(shù)都看成是一個(gè)字符串,每一個(gè)元素為十進(jìn)制數(shù)字所對(duì)應(yīng)的字 符,由于是后面的元素先進(jìn)行運(yùn)算,故我們應(yīng)當(dāng)把末尾的字符賦值給a[0],以此類推。如下所示:(s1,s2分別表示兩個(gè)相乘的字符串)
for(i=0; i<n; i++) a[i]=s1[n-i-1]-'0'; for(i=0; i<m; i++) b[i]=s2[m-1-i]-'0';
當(dāng)我們把需要操作的前后順序弄清之后,接下來(lái)就是核心的算法部分了(看了幾篇關(guān)于這個(gè)的博文,都沒(méi)有詳細(xì)的去解釋這個(gè)問(wèn)題)。其實(shí)上一張圖片已經(jīng)展示了將要做的算法步驟,但是說(shuō)實(shí)話也不是說(shuō)得很清楚,接下來(lái)看一下這張圖片:
當(dāng)我們把需要做的元素具體化之后,我們看到了其中的一個(gè)規(guī)律,上下能夠進(jìn)行相加的數(shù)字(通過(guò)-‘0'已經(jīng)變成了數(shù)字)他們的因數(shù)的角標(biāo)和是相等的,那么,我們就知道如何進(jìn)行計(jì)算:
/* 乘運(yùn)算*/ for(i=0; i<n; i++) for(j=0; j<m; j++) c[i+j]+=a[i]*b[j];
n,m分別代表字符串的長(zhǎng)度,也就是相乘元素的個(gè)數(shù)。解決了這個(gè)問(wèn)題,剩下的問(wèn)題便不是問(wèn)題
代碼如下(示例):
//大數(shù)乘法(字符串相乘) #include<stdio.h> #include<math.h> #include<string.h> #define M 10005 char s1[M],s2[M],s[M]; int a[M],b[M],c[M]; int main() { int i,j,m,n,k; while(~scanf("%s%s",s1,s2)) { memset(c,0,sizeof(c)); n=strlen(s1); m=strlen(s2); k=n+m;//保證相乘后的位數(shù)不會(huì)大于k printf("s1的長(zhǎng)度=%d s2的長(zhǎng)度=%d\n",n,m); /*把字符串s1和s2逆序用數(shù)字排列*/ for(i=0; i<n; i++) a[i]=s1[n-i-1]-'0'; for(i=0; i<m; i++) b[i]=s2[m-1-i]-'0'; /* 乘運(yùn)算*/ for(i=0; i<n; i++) for(j=0; j<m; j++) c[i+j]+=a[i]*b[j]; for(i=0; i<=k; i++)//進(jìn)行進(jìn)位操作 { if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]%=10; } } /*去除前導(dǎo)0*/ i=k; while(c[i]==0) i--; /*判斷兩個(gè)非負(fù)數(shù)之積是否為0,以及逆序打印c[]*/ if(i<0) printf("0"); else { for(; i>=0; i--) printf("%d",c[i]); } printf("\n"); } return 0; }
這里我們利用memset將c進(jìn)行初始化,那為什么不直接char c[]={0}?是因?yàn)槿绻址L(zhǎng),將會(huì)使代碼運(yùn)行較慢,并不是最優(yōu)解,而memset函數(shù)是直接訪問(wèn)地址,運(yùn)行速度將會(huì)提升。
memset有三個(gè)參數(shù),通過(guò)圖片我們發(fā)現(xiàn)依次為數(shù)組名,賦值整形,以及類型字節(jié)長(zhǎng)度,我們可以利用sizeof(void)求出
以上是“C語(yǔ)言中字符串相乘的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。