溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言中字符串相乘的示例分析

發(fā)布時(shí)間:2022-03-30 09:00:42 來(lái)源:億速云 閱讀:259 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹C語(yǔ)言中字符串相乘的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

    一. 分析思路

    示例:

    C語(yǔ)言中字符串相乘的示例分析

    我們把每一個(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)看一下這張圖片:

    C語(yǔ)言中字符串相乘的示例分析

    當(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)題

    二、使用步驟

    1.代碼如下

    代碼如下(示例):

    //大數(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;
    }

    2、memset函數(shù)

    這里我們利用memset將c進(jìn)行初始化,那為什么不直接char c[]={0}?是因?yàn)槿绻址L(zhǎng),將會(huì)使代碼運(yùn)行較慢,并不是最優(yōu)解,而memset函數(shù)是直接訪問(wèn)地址,運(yùn)行速度將會(huì)提升。

    C語(yǔ)言中字符串相乘的示例分析

    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è)資訊頻道!

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI