大整數的四則運算高質量C語言程序_第1頁
大整數的四則運算高質量C語言程序_第2頁
大整數的四則運算高質量C語言程序_第3頁
大整數的四則運算高質量C語言程序_第4頁
大整數的四則運算高質量C語言程序_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

-.z.設計題目:大整數的四則運算1.功能簡介:編寫出實現大整數之間相加,相減,相乘,相除的程序,并輸出計算結構。課程設計要求:采用模塊化程序設計源程序中應有足夠的注釋必須上機調試通過注重算法運用,優(yōu)化存儲效率與運算效率需提交源程序(含有注釋)及相關文件(數據或數據庫文件);提交設計報告書??傮w結構:數據初始化數據初始化判斷運算符號加法正整數非正整數轉變?yōu)檎麛禍p法轉變?yōu)榧臃ǔ朔ǔㄞD變?yōu)槌朔ê蜏p法退出流程圖:3.概要設計:加法運算利用兩個整形數組分別存放兩個數a和b的每一位的數值,最低位存放符號。如果a和b同號,從最低為開始計算,如果有進位則保存在高一位,本為則減10,然后反序將計算后的各個位的數值保存在一個數組c并輸出,如果a和b都是負數則在前面要輸出負號,函數的返回值為c的位數。如果a和b異號,也即兩個正整數相減,從最低位開始相減,如果要借位則本位加10再相減,高一位要減1,然后反序將計算后的各個位的數值保存在一個數組c并輸出,在前面要輸出相應的符號位。減法運算可將減法運算轉化為加法運算,只要將被減數的符號改變即可。乘法運算符號存放在最低位,將其中一個數a的每一位分別乘以另一個數b的每一位,并將結果保存在數組c中,然后重復計算a的下一位跟b的每一位的乘積,把上一次計算保存在c的值加上本次計算后的值,并保存在c自身中,直到a的最高位,最后輸出符號和相應的計算結果。除法運算利用乘法和減法,將除數分別乘以1到9,直到其值大于等于被除數的對應的數,然后被除數對應的數減去其乘積,保存在一個數組中,下一次循環(huán)把它歸到被除數中繼續(xù)做除法運算,最后得到余數并輸出。函數功能:voidinit(inta[],intb[],int*p1,int*p2) 功能說明:讀入所要計算的數值,數據初始化intplus(inta[],intb[],intc[],intm,intn)功能說明:兩個正整數相加3.voidchange(inta[],intb[],intm,intn)功能說明:當兩異號數相加時,改變其符號以符合加法運算intminus(inta[],intb[],intd[],intm,intn)功能說明:兩個正整數相減5.voidminusfun(inta[],intb[],intd[],intm,intn) 功能說明:判斷兩個異號數的相加方式intmulti(inta[],intb[],intc[],intm,intn)功能說明:兩個正整數相乘7.voidprint(longc[],intflag)功能說明:打印帶符號flag(1為負)的longc[]數組8.intwrite(longa[],intflag)功能說明:將鍵盤敲入的數字按4位一組放入longa[],且將符號放入flag9.voidmul(longa[],intfirst,intlast,longb[],longc[])功能說明:乘法,a的第last到first位乘以b,答案放到c10.intpara(longa[],intfirst,intlast,longb[])功能說明:比較數組a,b大小,firstlast分別為a的最高最低位11.intminusd(longa[],intfirst,intlast,longb[],longc[],intflag)功能說明:a為被減數,firstlast為a最高最低位,b為減數,c為差,flag為符號12.voiddiv(longa[],longb[],longc[],intfa)功能說明:除法,a除以b的值放入c,fa為a符號13.voidmenu()功能說明:打印菜單函數14.voidmain()功能說明:主函數,調用其余函數,計算相應功能的值并輸出。5.源程序:*include<iostream.h>*include<math.h>*include<stdio.h>*defineMA*40//可以修改,此時最大運算位數為四十位*defineN10//此處應為最大位數除以4voidinit(inta[],intb[],int*p1,int*p2)//輸入{ inti,j; charr,s; for(i=0;i<MA*;i++) { a[i]=0; b[i]=0; } printf("請輸入處理的第一個數的值:"); r=getchar(); if(r==45) { a[0]=r; for(i=1;(r=getchar())!='\n';i++) a[i]=r-48; } else { a[1]=r-48; for(i=2;(r=getchar())!='\n';i++) a[i]=r-48; } *p1=i; printf("請輸入處理的第二個數的值:"); s=getchar(); if(s==45) { b[0]=s; for(j=1;(s=getchar())!='\n';j++) b[j]=s-48; } else { b[1]=s-48; for(j=2;(s=getchar())!='\n';j++) b[j]=s-48; } *p2=j;}intplus(inta[],intb[],intc[],intm,intn)//加法運算{ intd[MA*]={0},i,j,k; for(i=0;i<MA*;i++)c[i]=0; if(a[1]==0) { for(i=0;i<n;i++)c[i]=b[i]; return(i); } if(b[1]==0) { for(i=0;i<m;i++)c[i]=a[i]; return(i); } for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++) { d[k]=a[i]+b[j]+d[k]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10;} } while(i>0) { d[k]=d[k]+a[i]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10; } k++; i--; } while(j>0) { d[k]=d[k]+b[j]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10; } k++; j--; } d[0]=a[0]+b[0]; c[0]=d[0]; if(d[k]==0) k--; for(i=1;k>0;i++,k--) c[i]=d[k]; return(i);}voidchange(inta[],intb[],intm,intn)//變號運算{ inti,j; intc[MA*]; if(m<=n&&b[0]==45) { for(i=1;i<m;i++) c[i]=a[i]; for(i=1,j=1;j<n;i++,j++) a[i]=b[j]; for(i=1,j=1;j<n;i++,j++) b[i]=c[j]; for(j=i;j<MA*;j++) b[j]=0; return; } if(m>=n&&a[0]==45) { a[0]=0; b[0]=45; return; }}intminus(inta[],intb[],intd[],intm,intn)//減法運算{ intc[MA*]={0},i,j,k; for(i=0;i<MA*;i++) d[i]=0; for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++) { if(c[k]<0||a[i]<b[j]) { c[k]=c[k]+a[i]-b[j]; if(c[k]<0) { c[k]+=10; c[k+1]--; } } elsec[k]=a[i]-b[j]; } while(i>0) { c[k]=c[k]+a[i]; if(c[k]<0) { c[k]+=10; c[k+1]--; } k++;i--; } c[k]=a[i]+c[k]; while(c[k]<=0&&k>0) k--; for(i=1;k>0;i++) d[i]=c[k--]; return(i);}voidminusfun(inta[],intb[],intd[],intm,intn)//判斷是否兩異號數相加{ inti,j,f=0,g=0; if(a[1]==0) { if(b[0]!=0)printf("-"); for(i=1;i<n;i++) printf("%d",b[i]); printf("\n"); return; } if(b[1]==0) { if(a[0]!=0) printf("-"); for(i=1;i<m;i++) printf("%d",a[i]); printf("\n"); return; } if(m==n) { for(i=1;i<m;i++) { if((a[i]<b[i]&&b[0]==45)||(a[i]>b[i]&&a[0]==45)) g=1; if(a[i]!=b[i])f=1; } if(f==0) { printf("0\n"); return; } if(g==1) { change(a,b,m,n); printf("-"); j=minus(a,b,d,n,m); for(i=1;i<j;i++)printf("%d",d[i]); printf("\n");return; } elseif(a[0]==45&&b[0]==0) { j=minus(b,a,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } else { j=minus(a,b,d,m,n); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n");return; } } if(m>n&&b[0]==45) { j=minus(a,b,d,m,n); for(i=1;i<j;i++)printf("%d",d[i]); printf("\n");return; } if(m<n&&b[0]==45) { change(a,b,m,n); printf("-"); j=minus(a,b,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } if(m>n&&a[0]==45) { change(a,b,m,n); printf("-"); j=minus(a,b,d,m,n); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } if(m<n&&a[0]==45) { j=minus(b,a,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; }}intmulti(inta[],intb[],intc[],intm,intn)//正整數乘法運算{ intd[MA*]={0},e[MA*]={0},i,j,k,r,s,*,y; for(i=0;i<MA*;i++) c[i]=0; if(m<=n) { for(i=m-1,s=1;i>0;i--,s++) { for(r=0;r<MA*;r++){d[r]=0;e[r]=0;} for(j=n-1,k=1*s;j>0;j--,k++) { d[k]=a[i]*b[j]+d[k]; if(d[k]>9){d[k+1]=d[k+1]+d[k]/10;d[k]=d[k]%10;} } if(d[k]==0) k--; y=k; for(r=1;k>0;r++,k--) e[r]=d[k]; for(r=1;r<MA*;r++) d[r]=e[r]; if(s==1) *=plus(c,d,e,0,y+1); else *=plus(c,d,e,y,y+1); for(r=0;r<MA*;r++) c[r]=e[r]; } } elseif(m>n) { for(j=n-1,s=1;j>0;j--,s++) { for(r=0;r<MA*;r++) { d[r]=0;e[r]=0; } for(i=m-1,k=1*s;i>0;i--,k++) { d[k]=a[i]*b[j]+d[k]; if(d[k]>9) { d[k+1]=d[k+1]+d[k]/10; d[k]=d[k]%10; } } if(d[k]==0) k--; y=k; for(r=1;k>0;r++,k--) e[r]=d[k]; for(r=1;r<MA*;r++) d[r]=e[r]; if(s==1) *=plus(c,d,e,0,y+1); else *=plus(c,d,e,y,y+1); for(r=0;r<MA*;r++) c[r]=e[r]; } } return(*);}voidprint(longc[],intflag)//輸出{ inti; for(i=N-1;i>=0;i--) if(c[i])break;if(flag) printf("-");printf("%4d",c[i--]);for(;i>=0;i--){if(c[i]/1000) printf("%4ld",c[i]);elseif(c[i]/100) printf("0%3ld",c[i]);elseif(c[i]/10) printf("00%2ld",c[i]);else printf("000%1ld",c[i]);}}intwrite(longa[],intflag)//將鍵盤敲入的數字按4位一組放入longa[],且將符號放入flag{ charnum[N*4]; chartemp; inti,j,k; for(i=0;i<N*4;i++) { num[i]=getchar(); if(num[i]==10) { i--; break; } if(num[i]==45) { flag=(flag+1)%2; i--; } } k=0; for(j=0;j<=i/2;j++) { temp=num[j]; num[j]=num[i-k]; num[i-k]=temp; k++; } k=1; for(j=0;j<=i;j++) switch(k) {case1:a[j/4]+=(long)(num[j]-48); k++;break;case2:a[j/4]+=(long)(num[j]-48)*10; k++;break;case3:a[j/4]+=(long)(num[j]-48)*100; k++;break;case4:a[j/4]+=(long)(num[j]-48)*1000; k=1;break;} returnflag;}voidmul(longa[],intfirst,intlast,longb[],longc[])//乘法{inti,j;intma*_i;longtemp;for(ma*_i=N-1;ma*_i>=0;ma*_i--)if(b[ma*_i])break;for(i=0;i<=ma*_i;i++)if(b[i])for(j=first;j<=last;j++) { temp=a[j]*b[i]; c[i+j-first]+=temp%10000; c[i+j-first+1]+=((temp/10000)+(c[i+j-first]/10000)); c[i+j-first]=c[i+j-first]%10000;}}intpara(longa[],intfirst,intlast,longb[])//比較數組a,b大小{ intflag=2; inti; intk=0; intlen; for(len=N-1;len>=0;len--) if(b[len]) break; if((first-last)>=len) { if((first-last)>len) flag=1; else for(i=len;i>=0;i--) { if(a[first-k]>b[i]) { flag=1; break; }if(a[first-k]<b[i]) {flag=0;break;}k++; } } else flag=0; return flag;}intminusd(longa[],intfirst,intlast,longb[],longc[],intflag){ intnotchange; inti,k=0; intma*; notchange=para(a,first,last,b); if(notchange) { for(i=last;i<=first;i++) { if(a[i]<b[k]) { a[i]+=10000; a[i+1]--; } c[i]=a[i]-b[k]; k++; } } else { flag=(flag+1)%2; for(ma*=N-1;ma*>=0;ma*--) if(b[ma*]) break; for(i=0;i<=ma*;i++) { if(b[i]<a[last+k]) { b[i]+=10000; b[i+1]--; } c[i]=b[i]-a[last+k]; k++; } } returnflag;}voiddiv(longa[],longb[],longc[],intfa)//除法{ longresult[N+1]={0}; intlen_a; intk; inti; printf("\n"); print(a,fa); for(len_a=N-1;len_a>=0;len_a--) if(a[len_a]) break; k=len_a; while(para(a,len_a,0,b)) { while(!para(a,len_a,k,b)) k--; c[k]=1; mul(c,k,k,b,result); while(para(a,len_a,k,result)){ c[k]++; for(i=N-1;i>=0;i--) result[i]=0; mul(c,k,k,b,result); } c[k]--; for(i=N-1;i>=0;i--) result[i]=0; mul(c,k,k,b,result); minusd(a,len_a,k,result,a,0); for(i=N-1;i>=0;i--) result[i]=0; for(len_a=N-1;len_a>=0;len_a--) if(a[len_a]) break; k=len_a; }}voidmenu()//菜單{ printf("==================================大整數計算器=================================="); printf("1.加法 2.減法 3.乘法 4.除法 0.退出\n"); printf("請從1~4中選擇:"); return;}voidmain()//主函數{ intflag;intma*; intfa; intfb; longad[N],bd[N],cd[2*N]; inta[MA*]={0},b[MA*]={0},c[MA*]={0},d[MA*]={0}; chars; intm,n,i,j; int*p1,*p2; p1=&m; p2=&n; menu(); s=getchar(); getchar(); while(1) { switch(s) { case'0': return; case'1': printf("格式為:a+b\n"); init(a,b,p1,p2); if(a[1]==0&&b[1]==0) { printf("結果是:a+b=0\n"); break; } if(a[0]==b[0]) { j=plus(a,b,c,m,n); printf("結果是:a+b="); if(c[0]!=0) printf("-"); for(i=1;i<j;i++) printf("%d",c[i]); } else { printf("結果是:a+b="); minusfun(a,b,d,m,n); } printf("\n"); break; case'2': printf("格式為:a-b\n"); init(a,b,p1,p2); if(b[0]==0) b[0]=45; elseif(b[0]==45) b[0]=0; if(a[1]==0&&b[1]==0) { printf("結果是:a-b=0\n"); break; } if(a[0]==b[0]) { j=plus(a,b,c,m,n); printf("結果是:a-b="); if(c[0]!=0) printf("-"); for(i=1;i<j;i++) printf("%d",c[i]); } else { printf("結果是:a-b="); minusfun(a,b,d,m,n); } printf("\n"); break; case'3': init(a,b,p1,p2); if(a[1]==0||b[1]==0) { printf("結果是:0\n"); break; } j=multi(a,b,c,m,n); printf("結果是:"); if((a[0]==45&&b[0]==0)||(b[0]=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論