大整數(shù)的四則運(yùn)算 高質(zhì)量C語言程序_第1頁
大整數(shù)的四則運(yùn)算 高質(zhì)量C語言程序_第2頁
大整數(shù)的四則運(yùn)算 高質(zhì)量C語言程序_第3頁
大整數(shù)的四則運(yùn)算 高質(zhì)量C語言程序_第4頁
大整數(shù)的四則運(yùn)算 高質(zhì)量C語言程序_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論