日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

大整数乘法

發(fā)布時(shí)間:2024/8/5 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 大整数乘法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

昨天上了大三的算法課,學(xué)了大整數(shù)乘法,上課聽(tīng)得很明白,但回來(lái)實(shí)現(xiàn),就有點(diǎn)問(wèn)題了。。

① 做乘法的時(shí)候,要記得減去'0'的ascii碼48。

② 存數(shù)字的數(shù)組要記得從1開(kāi)始存,如果從0開(kāi)始存的話,進(jìn)位時(shí)可能會(huì)導(dǎo)致越界 - -

③ 進(jìn)位時(shí),記得要用一個(gè)循環(huán),不斷進(jìn)位,這個(gè)地方坑了我很久 - -

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define N 100
 5 char number1[N];
 6 char number2[N];
 7 char result[2*N];
 8 
 9 int main()
10 {
11     printf( "please input the first number:
" );
12     scanf( "%s", number1 );
13     printf( "please input the next number:
" );
14     scanf( "%s", number2 );
15     int i, j, len1, len2, p;
16     len1 = strlen(number1);
17     len2 = strlen(number2);
18     for( i=len1; i>0; i-- )
19         number1[i] = number1[i-1];
20     for( i=len2; i>0; i-- )
21         number2[i] = number2[i-1];
22     memset( result, -1, sizeof(result) );
23     for( i=1; i<=len1; i++ )
24         for( j=1; j<=len2; j++ )
25         {
26             if( result[i+j] == -1 )
27                 result[i+j] = (number1[i]-48)*(number2[j]-48);
28             else
29                 result[i+j] += (number1[i]-48)*(number2[j]-48);
30             p = i+j;
31             while( result[p] > 9 )
32             {
33                 if( result[p-1] == -1 )
34                     result[p-1] = result[p]/10;
35                 else
36                     result[p-1] += result[p]/10;
37                 result[p] %= 10;
38                 p--;
39             } 
40         }
41 
42     for( i=1; result[i]!=-1; i++ )
43         printf( "%d", result[i] );
44     printf( "
" );
45     system( "pause" );
46     return 0;
47 }

樣例輸入

12345678900
98765432100

樣例輸出

1219326311126352690000

以上的代碼是有問(wèn)題的,沒(méi)有經(jīng)過(guò)OJ的測(cè)試。
① 時(shí)間復(fù)雜度很高,o(n*n)的復(fù)雜度上,還要乘于進(jìn)位所帶來(lái)的復(fù)雜度!!!
② 沒(méi)有細(xì)細(xì)考慮到前置0的情況!!!
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 10000
 4 char number1[N];
 5 char number2[N];
 6 int result[2*N];
 7 int ans[2*N];
 8 
 9 int main()
10 {
11     scanf( "%s%s", number1, number2 );
12     int i, j, len1, len2, p, len;
13     len1 = strlen(number1);
14     len2 = strlen(number2);
15     
16     for( i=0; i<len1; i++ )
17         for( j=0; j<len2; j++ )
18             result[i+j] += (number1[i]-48)*(number2[j]-48);
19             
20     len = len1+len2-2;
21     p = 0;
22     while( len > 0 )
23     {
24         result[len-1] += result[len]/10;
25         ans[p++] = result[len--]%10;
26     }
27     ans[p] = result[0];
28     while( ans[p] == 0 )
29         p--;
30     if( p == -1 )
31         printf( "0
" );
32     else
33     {
34         for( ; p>=0; p-- )
35             printf( "%d", ans[p] );
36         printf( "
" );
37     }
38     return 0;
39 }

總結(jié)

以上是生活随笔為你收集整理的大整数乘法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。