青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
在計算機中,長整型(long int)變量的范圍是 -2147483648 至 2147483647,因此若用長整型變量做乘法運算,乘積最多不能超過 10位數。即便用雙精度型(double)變量,也僅能保證 16 位有效數字的精度。在某些需要更高精度的乘法運算的場合,需要用別的辦法來實現乘法運算。 比較容易想到的是做多位數乘法時列豎式進行計算的方法,只要寫出模擬這一過程的程序,就能實現任意大整數的乘法運算。經過查閱資料,找到一種更易于編程的方法,即“列表法”。 下面先介紹“列表法”: 例如當計算8765 x 234時,把乘數與被乘數照如下列出,見表1: 8 7 6 5 8765 2 16 14 12 10 2 3 24 21 18 15 3 4 32 28 24 20 4 表 1 表 2 把每個空格所在的行列的數字的乘積填入空格中,得表2。把表2中的數按圖示斜線分組(橫縱坐標和相等的數分為一組),把每組數的累加起來所得的和記在表格下方,見表 3: 16 14 12 10 24 21 18 15 32 28 24 20 16 38 65 56 39 20 表 3 最后把表格下方一行數作如下處理,見表4: 從最低位的 20 開始,保留個位數字“0”,把個位以外的數“2”進到前一位;把次低位的 39 加上低位進上來的 2 得 41,保留個位數字“1”,把“4”進到前一位;以此類推,直至最高位的 16,16 加上低位進上來的4得 20,保留“0”,把2進到最高位,得乘積答數 2051010。 16 38 65 56 39 20 2 16+4=20 38+7=45 65+6=71 56+4=60 39+2=41 留0進2 留5進4 留1進7 留0進6 留1進4 留0進2 2 0 5 1 0 1 0 表 4 根據以上思路就可以編寫C 程序了,再經分析可得: 1、一個m 位的整數與一個 n 位的整數相乘,乘積為m+n-1 位或m+n 位。 2、程序中,用三個字符數組分別存儲乘數、被乘數與乘積。由第 1 點分析知,存放乘積的字符數組 的長度應不小于存放乘數與被乘數的兩個數組的長度之和。 3、可以把第二步“計算填表”與第三四步“累加進位”放在一起完成,可以節省存儲表格 2所需的空間。 4、程序關鍵部分是兩層循環,內層循環累計一組數的和,外層循環處理保留的數字與進位。 編寫的程序如下: 程序 1 清單: /* multiply.c */ /* 11/20/2008 */ #define MAXLENGTH 1000 #include #include void compute(char *a, char *b, char *c); void main(void) { char a[MAXLENGTH], b[MAXLENGTH], c[MAXLENGTH * 2]; puts("Input multiplier :"); gets(a); puts("Input multiplicand :"); gets(b); compute(a, b, c); puts("Answer :"); puts(c); getchar(); } void compute(char *a, char *b, char *c) { int i, j, m, n; long sum, carry; m = strlen(a) - 1; n = strlen(b) - 1; for (i = m; i >= 0; i--) a[i] -= '0'; for (i = n; i >= 0; i--) b[i] -= '0'; c[m + n + 2] = '\0'; carry = 0; for (i = m + n; i >= 0; i--) /* i 為坐標和 */ { sum = carry; if ((j = i - m) < 0) j = 0; for ( ; j<=i && j<=n; j++) /* j 為縱坐標 */ sum += a[i-j] * b[j]; /* 累計一組數的和 */ c[i + 1] = sum % 10 + '0'; /* 算出保留的數字 */ carry = sum / 10; /* 算出進位 */ } if ((c[0] = carry+'0') == '0') /* if no carry, */ c[0] = '\040'; /* c[0] equals to space */ } 效率分析:用以上算法計算 m位整數乘以n 位整數,需要先進行 m x n次乘法運算,再進行約 m + n次加法運算和 m + n次取模運算(實為整數除法)。把這個程序稍加修改,讓它自己產生乘數與被乘 數,然后計算隨機的 7200位整數互乘,在Cyrix 6x86 pr166機器的純DOS方式下耗時 7秒(用Borland C 3.1編譯)。 經過改進,此算法效率可以提高約9 倍。 注意到以下事實:8216547 x 96785 將兩數從個位起,每 3位分為節,列出乘法表,將斜線間的 數字相加; 8 216 547 96 785 768 20736 52512 6280 169560 429395 768 27016 222072 429395 將表中最后一行進行如下處理:從個位數開始,每一個方格里只保留三位數字,超出 1000 的部 分進位到前一個方格里; 768 27016 222072 429395 768+27 27016+222 222072+429 =795 =27238 =222501 395 795 238 501 395 所以8216547 x 96785 = 795238501395 也就是說我們在計算生成這個二維表時,不必一位一位地乘,而可以三位三位地乘;在累加時也是滿1000進位。這樣,我們在計算 m位整數乘以 n位整數,只需要進行 m x n / 9次乘法運算,再進行約(m + n) / 3次加法運算和(m + n) /3 次取模運算。總體看來,效率約是前一種算法的 9倍。 有人可能會想:既然能夠三位三位地乘,為什么不4位 4位甚至5位5位地乘呢?那不是可以提高 16 乃至 25 倍效率嗎?聽我解來:本算法在累加表中斜線間的數字時,如果用無符號長整數(范圍 0至~4294967295)作為累加變量,在最不利的情況下(兩個乘數的所有數字均是 9),能夠累加約4294967295/(999*999)=4300 次,也就是能夠準確計算任意兩個均不超過 12900(每次累加的結果"值"三位,故 4300*3=12900)位的整數相乘。如果 4 位 4 位地乘,在最不利的情況下,能夠累加約4294967295/(9999*9999)=43 次,僅能夠確保任意兩個不超過 172 位的整數相乘,沒有什么實用價值,更不要說5位了。 請看改進后的算法的實例程序: 該程序隨機產生兩個72xx位的整數,把乘數與積保存在 result.txt中。 在Borland C++ 3.1 中用 BCC -3 -O2 -G -mh -Z -f287 -pr -T- dashu.cpp 編譯生成的exe文件在Cyrix 6x86 pr166的機器上運行耗時0.82 秒。 程序 2 清單: #include #include #include #include #include #define N 7200 //作 72xx 位的整數乘法 int max(int,int,int); int initarray(int a[]); void write(int a[],int l); FILE *fp; void main() { int a[5000]={0},b[5000]={0},k[10001]={0}; //聲明存放乘數、被乘數與積的數組 clock_t start, end; //聲明用于計時的變量 unsigned long c,d,e; //聲明作累加用的無符號長整數變量 int i,j,la,lb,ma,mi,p,q,t; //聲明其它變量 randomize(); //初始化隨機數 la=initarray(a); //產生被乘數,并返回其長度 lb=initarray(b); //產生乘數,并返回其長度 if(lala)?lb:la; for (q=0;q=0;i--) //累加斜線間的數,i 為橫縱坐標之和 { c=d; //將前一位的進位標志存入累加變量 c ma=max(0,i-la+1,i-lb+1); //求累加的下限 mi=(i>la-1)?(la-1):i; //求累加的上限 for(j=ma;j<=mi;j++) //計算出橫縱坐標之和為 i 的單元內的數,并累加到 C 中 c+=(long)a[j]*b[i-j]; d=c/1000; //求進位標志 if(c>999) c%=1000; //取 c 的末三位 k[i]=c; //保存至表示乘積的數組 k[] } e=k[0]+1000*d; //求出乘積的最高位 end = clock();//停止計時 fp = fopen("result.txt", "w+"); //保存結果到 result.txt printf("\nThe elapsed time was: %3.4f\n", (end - start) / CLK_TCK); //打印消耗的時間 fprintf(fp,"%d",a[0]); //打印被乘數最高位 write(a,la); //打印被乘數其他位 fprintf(fp,"%d",b[0]); //打印乘數最高位 write(b,lb); //打印乘數其他位 fprintf(fp,"%ld",e); //打印乘積最高位 write(k,la+lb-1); //打印乘積其他位 fclose(fp); } max(int a,int b,int c) { int d; d=(a>b)?a:b; return (d>c)?d:c; } int initarray(int a[]) { int q,p,i; q=N+random(100); if(q%3==0) p=q/3; else p=q/3+1; for(i=0;iposted on 2009-12-06 23:26 chatler 閱讀(1149) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性色一区二区| 久久精品久久综合| 亚洲黄色成人| 欧美国产综合视频| 夜夜夜久久久| 一区二区免费在线播放| 国产精品二区在线| 久久精品在线播放| 久久露脸国产精品| 亚洲精品一二三| 一本色道久久综合亚洲二区三区| 欧美天堂亚洲电影院在线播放| 午夜天堂精品久久久久| 午夜久久久久久| 亚洲国产精品一区在线观看不卡| 欧美黑人国产人伦爽爽爽| 欧美人与性动交a欧美精品| 亚洲欧美制服另类日韩| 久久久久国产成人精品亚洲午夜| 91久久综合| 亚洲一区二区少妇| 亚洲国产精品黑人久久久| 99www免费人成精品| 国产视频不卡| 亚洲国产色一区| 国产精品人人做人人爽人人添| 久久精品噜噜噜成人av农村| 欧美电影专区| 久久国产精品久久久| 女人色偷偷aa久久天堂| 欧美一级二级三级蜜桃| 美日韩精品免费观看视频| 午夜精品久久久99热福利| 久热这里只精品99re8久| 亚洲自拍偷拍福利| 另类酷文…触手系列精品集v1小说| 亚洲调教视频在线观看| 久久永久免费| 欧美一区午夜视频在线观看| 欧美黑人在线播放| 久久米奇亚洲| 国产精品美女久久久| 亚洲欧洲精品一区二区三区不卡| 国产欧美亚洲一区| 宅男噜噜噜66国产日韩在线观看| 亚洲激情国产| 久热re这里精品视频在线6| 香蕉久久夜色精品| 欧美日韩一区二| 亚洲国产精品激情在线观看| 国内精品嫩模av私拍在线观看| 一区二区三区.www| 一本色道久久88精品综合| 美玉足脚交一区二区三区图片| 午夜一区二区三视频在线观看| 欧美激情中文不卡| 欧美激情国产日韩精品一区18| 国产一级揄自揄精品视频| 亚洲一级在线| 午夜欧美不卡精品aaaaa| 欧美先锋影音| 夜色激情一区二区| 999在线观看精品免费不卡网站| 久久婷婷综合激情| 欧美ed2k| 亚洲日韩成人| 欧美国产亚洲视频| 最新中文字幕亚洲| 一二三区精品福利视频| 欧美日韩亚洲国产精品| 日韩午夜激情av| 这里只有精品视频| 欧美午夜精品久久久久久孕妇| 亚洲狼人综合| 亚洲一区三区在线观看| 国产精品日韩在线观看| 亚洲欧美一区在线| 巨胸喷奶水www久久久免费动漫| 精品1区2区3区4区| 久久青青草综合| 亚洲国产精品成人综合色在线婷婷| 亚洲人成人一区二区三区| 欧美精品久久久久久久| 99xxxx成人网| 久久成人18免费观看| 在线播放精品| 欧美日韩第一页| 亚洲一区二区精品在线观看| 欧美在线观看视频一区二区| 影音先锋亚洲一区| 欧美成人一区二区三区| 这里只有视频精品| 老巨人导航500精品| 99国产精品| 国产日本欧美在线观看| 美女黄毛**国产精品啪啪| 日韩亚洲一区二区| 久久久免费精品视频| 亚洲人体偷拍| 国产日韩欧美自拍| 嫩草国产精品入口| 亚洲欧美日韩一区二区| 欧美好骚综合网| 欧美一二三区在线观看| 亚洲国产成人tv| 国产精品久久精品日日| 久久亚洲综合色| 亚洲特黄一级片| 欧美国产亚洲另类动漫| 欧美在线视频免费播放| 亚洲精品一区二区三区四区高清| 国产精品久久久久aaaa| 欧美xxx成人| 久久精品国产一区二区三区| 亚洲精品孕妇| 欧美电影电视剧在线观看| 午夜影院日韩| 在线综合亚洲| 亚洲精品极品| 影音欧美亚洲| 国产一区二区三区视频在线观看| 欧美日韩成人综合在线一区二区| 久久久久久日产精品| 亚洲欧美韩国| 一区二区三区日韩在线观看| 亚洲激情亚洲| 欧美成人一区二免费视频软件| 欧美在线视频免费播放| 亚洲午夜一区二区三区| 亚洲欧洲日产国产综合网| 一区二区视频免费在线观看| 国产精品社区| 国产精品高清在线| 欧美揉bbbbb揉bbbbb| 欧美精品一区二区三区蜜桃| 欧美成人蜜桃| 欧美成人精品一区| 欧美大尺度在线| 你懂的视频一区二区| 免费视频最近日韩| 免费成人激情视频| 欧美激情第10页| 欧美精品v国产精品v日韩精品| 女生裸体视频一区二区三区| 蜜桃伊人久久| 欧美顶级艳妇交换群宴| 欧美韩日视频| 欧美日韩在线观看视频| 欧美视频在线观看| 国产精品激情| 国产麻豆综合| 韩国精品主播一区二区在线观看| 国产一区久久久| 亚洲高清电影| 日韩亚洲在线| 亚洲新中文字幕| 欧美亚洲日本国产| 久久久久国产成人精品亚洲午夜| 久久人人精品| 欧美高清一区| 日韩亚洲精品在线| 亚洲欧美日韩国产一区二区| 欧美一区二区日韩一区二区| 欧美一区二区三区日韩| 久久免费高清视频| 欧美精品综合| 国产麻豆日韩欧美久久| 亚洲第一精品在线| 一区二区av在线| 久久精品电影| 亚洲国产精品久久久久婷婷老年 | 在线欧美亚洲| 亚洲人午夜精品免费| 亚洲一区免费在线观看| 久久久久久久性| 亚洲国产精品免费| 亚洲一区二区三区视频播放| 久久精品日产第一区二区| 欧美激情国产日韩| 国产日韩精品一区二区三区| 亚洲国产日韩欧美在线动漫| 亚洲一区二区三区高清 | 欧美成人一区二区三区| 99国产精品久久久久老师| 久久国产精品久久久久久久久久| 欧美xx69| 国内欧美视频一区二区| 一本不卡影院| 免费国产一区二区| 亚洲一区二区视频在线| 欧美成黄导航| 国产精品夜夜夜| 日韩网站在线观看| 老司机一区二区| 亚洲在线视频观看| 欧美另类一区二区三区| 韩国亚洲精品| 欧美中文在线免费| 99在线|亚洲一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎|