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

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 閱讀(1147) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(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>
            亚洲人体大胆视频| 国产欧美日韩视频在线观看| 一本色道久久88亚洲综合88| 欧美专区亚洲专区| 久久xxxx精品视频| 久久久久中文| 免费观看久久久4p| 亚洲国产高清视频| 亚洲国产精品传媒在线观看| 亚洲日本一区二区| 亚洲男人的天堂在线观看| 欧美在线综合视频| 蜜桃av一区二区| 欧美美女视频| 国产精品久久综合| 尤物视频一区二区| 亚洲图片在线观看| 久久久久国产一区二区三区四区 | 亚洲激情小视频| 亚洲狼人精品一区二区三区| 亚洲一区国产视频| 久久一区二区三区国产精品| 免费在线视频一区| 亚洲精选成人| 欧美亚洲视频在线观看| 久久男女视频| 欧美日韩1区| 国产一区二区精品丝袜| 亚洲精品在线一区二区| 久久国产精品免费一区| 亚洲国产精品电影在线观看| 亚洲网站在线看| 免费亚洲一区二区| 国产一区二区三区四区老人| 亚洲视频欧美视频| 欧美大片一区二区三区| 亚洲免费视频网站| 久久深夜福利| 免费欧美在线| 国产模特精品视频久久久久| 91久久久久久久久久久久久| 性欧美1819sex性高清| 亚洲精品男同| 激情综合自拍| 男女精品网站| 韩国av一区二区三区| 亚洲欧美国产另类| 亚洲精品一区二区三区樱花| 久久在线91| 国模一区二区三区| 久久激情婷婷| 亚洲欧美乱综合| 欧美性猛片xxxx免费看久爱| 日韩一级二级三级| 亚洲第一狼人社区| 久久精品综合| 国产综合视频| 久久成人综合网| 亚洲欧美在线高清| 国产日韩精品一区观看| 午夜亚洲视频| 中文国产一区| 国产精品久久久免费| 亚洲欧美一级二级三级| 亚洲一区欧美| 国产欧美日韩精品专区| 久久黄色网页| 久久免费视频在线| 亚洲毛片网站| 99这里只有久久精品视频| 国产精品xnxxcom| 香蕉成人啪国产精品视频综合网| 国产在线精品一区二区中文| 久久综合九色九九| 亚洲国产精品尤物yw在线观看| 欧美 亚欧 日韩视频在线| 狂野欧美性猛交xxxx巴西| 亚洲精品乱码久久久久久按摩观| 亚洲欧洲精品一区二区精品久久久| 欧美精品黄色| 午夜亚洲激情| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲精品无人区| 在线一区欧美| 激情综合激情| 99综合精品| 国产在线拍偷自揄拍精品| 欧美国产日韩一区二区在线观看| 欧美精品v国产精品v日韩精品| 亚洲综合电影| 久久精品一区蜜桃臀影院| 亚洲精品中文字幕女同| 一区二区三区四区五区在线| 国内成人自拍视频| 亚洲精品1234| 国产婷婷一区二区| 亚洲国产精品成人一区二区| 国产精品欧美日韩久久| 亚洲欧美日韩精品在线| 国产私拍一区| 欧美黄色免费| 欧美视频三区在线播放| 久久精品视频99| 亚洲国产精品久久久久| 亚洲美女视频在线观看| 亚洲在线视频免费观看| 亚洲国产精品久久久久| 亚洲男人第一av网站| 日韩亚洲欧美一区二区三区| 亚洲欧美成人一区二区在线电影| 亚洲国产欧美一区二区三区久久| 一区二区久久| 亚洲国内精品在线| 欧美亚洲一区| 亚洲一区免费网站| 欧美国产91| 免费在线欧美视频| 国产欧美综合在线| 在线中文字幕日韩| 日韩一区二区精品葵司在线| 久久噜噜噜精品国产亚洲综合| 亚洲欧美日韩一区二区三区在线| 欧美国产国产综合| 欧美国产视频在线观看| 黄色成人片子| 久久精彩视频| 久久成人免费网| 国产精品色婷婷| 一区二区三区日韩| 国产精品99久久久久久白浆小说| 欧美插天视频在线播放| 女同性一区二区三区人了人一 | 一区二区三区欧美在线| 亚洲最新色图| 欧美—级a级欧美特级ar全黄| 欧美成人首页| **欧美日韩vr在线| 久久亚洲国产精品日日av夜夜| 久久婷婷麻豆| 在线播放中文字幕一区| 久久久久国内| 欧美h视频在线| 伊人久久av导航| 久久亚洲私人国产精品va媚药| 老司机午夜精品| 亚洲国产成人久久| 欧美99在线视频观看| 亚洲第一页中文字幕| 在线日本成人| 欧美国产日韩精品| 日韩亚洲欧美一区| 欧美亚洲日本网站| 国户精品久久久久久久久久久不卡 | 91久久综合| 亚洲伊人色欲综合网| 国产伦精品一区二区三区| 欧美亚洲综合久久| 亚洲第一在线视频| 午夜精品理论片| 精品91视频| 欧美日韩国产综合久久| 国产精品一二| 亚洲视频在线观看一区| 欧美伊人久久| 国内精品一区二区三区| 久久夜色撩人精品| 亚洲精品九九| 欧美在线视频一区二区| 亚洲电影专区| 欧美视频一区在线| 久久xxxx| 亚洲精品国产系列| 久久激情综合网| 亚洲国产综合视频在线观看| 欧美系列亚洲系列| 久久久久久网站| 一区二区高清在线| 你懂的视频欧美| 亚洲欧美www| 亚洲黑丝在线| 国产欧美精品在线播放| 老司机成人在线视频| 亚洲天堂网在线观看| 乱人伦精品视频在线观看| 中文一区字幕| 亚洲精品1区2区| 国产午夜精品一区二区三区欧美| 欧美高清自拍一区| 欧美在线91| 亚洲视频在线看| 91久久久久久久久| 久久免费视频在线观看| 中日韩男男gay无套| 伊人久久成人| 国产日韩欧美成人| 欧美午夜宅男影院在线观看| 欧美成人综合| 久久人人超碰| 久久久精品动漫| 午夜精品一区二区三区在线播放|