hongduong Đại tướng
Tổng số bài gửi : 315 Reputation : 33 Join date : 10/08/2011 Age : 32 Đến từ : Đất Tổ Châu Phong
| Tiêu đề: Thao tác Số nguyên lớn trong C Mon Jun 25, 2012 8:57 am | |
| Mình không giới thiệu dài dòng, như các bạn đã biết với các số lớn trong C khi thực hiện các thao tác cộng, trừ, nhân, chia sẽ sảy ra hiện tượng tràn bộ nhớ, gây nhiều lúng túng cho các bạn. Nhưng với việc sử dụng mảng thì vấn đề này được giải quyết khá đơn giản. Hôm rồi mình có sưu tầm trên mạng mấy đoạn code này - code này có nhược điểm là nếu nhập số có số chữ số lớn sẽ mất khá nhiều thời gian vì phải nhập mảng rời nhau (các số cách nhau bằng dấu space ), hôm nay post lên đây, hy vọng giúp ích các bạn...(Các bạn cùng kiểm tra, có gì bổ sung nhé!) Phần 1: Thao tác toán Cộng - Code:
-
#include <stdio.h> #include <conio.h> int m,n,dem,nho=0,s,i,j,a[100],b[100],c[100]; //Gia su so nguyen lon co 100 chu so; tuy y! void nhap() { printf("Nhap so chu so cua so nguyen a, m= "); scanf("%d",&m); printf("Nhap lan luot cac chu so cua a (ngan cach nhau bang space):\n"); for(i=m-1;i>=0;i--) scanf("%d",&a[i]); printf("\n\nNhap so chu so cua so nguyen b, n= "); scanf("%d",&n); printf("Nhap lan luot cac chu so cua b (ngan cach nhau bang space):\n"); for(i=n-1;i>=0;i--) scanf("%d",&b[i]); //Buoc 1: Loai bo cac chu so 0 vo nghia o mang a va b while((a[m-1]==0)&&(m>0)) m--; if(m==0) a[m++]=0; while((b[n-1]==0)&&(n>0)) n--; if(n==0) b[n++]=0; //Buoc 2: Them cac chu so 0 vao dau cua mang co so phan tu be hon if(m<n) for(i=1;i<=n-m;i++) a[m-1+i]=0; else for(i=1;i<=m-n;i++) b[n-1+i]=0; if(m<n)m=n; else n=m; } void cong(int *a,int *b) //Buoc 3: Tinh c[i] va nho { for(i=0;i<m;i++) { c[i]=(a[i]+b[i]+nho)%10; nho=(a[i]+b[i]+nho)/10; } if(nho>0) c[m++]=nho; } int main() { nhap(); cong(a,b); printf("\n\nTong la: \n"); for(i=m-1;i>=0;i--) //Buoc 4: Xuat ket qua printf("%d",c[i]); getch(); return 0; } Phần 2: Thao tác phép toán Trừ - Code:
-
#include <stdio.h> #include <conio.h> int m,n,dem,nho=0,i,a[100],b[100],c[100]; void Input() { printf("Nhap so cac chu so cua a: "); scanf("%d",&m); printf("\nNhap so a (cac chu so cach nhau boi dau space): "); for(i=m-1;i>=0;i--) scanf("%d",&a[i]); printf("\n\nNhap so cac chu so cua b: "); scanf("%d",&n); printf("\nNhap so b (cac chu so cach nhau boi dau space): "); for(i=n-1;i>=0;i--) scanf("%d",&b[i]); if(m>n) for(i=1;i<=m-n;i++) b[n-1+i]=0; else for(i=1;i<=n-m;i++) a[m-1+i]=0; if(m<n) m=n; else n=m; } bool Sosanh() { i=m-1; while((a[i]==b[i])&&(i>=0)) i--; if((i<0)||(a[i]>b[i])) return true; else return false; } void Tru(int *a,int *b) { int tam; if(!Sosanh()) { printf("-"); for(i=0;i<n;i++) { tam=a[i]; a[i]=b[i]; b[i]=tam; } } for(i=0;i<m;i++) if(a[i]-nho>=b[i]) { c[i]=(a[i]-b[i]-nho)%10; nho=0; } else { c[i]=(a[i]+10-b[i]-nho)%10; nho=1; } while(c[m-1]==0) m--; if(m==0)c[m++]=0; } int main() { Input(); Tru(a,b); for(i=m-1;i>=0;i--) printf("%d",c[i]); getch(); return 0; } Phần 3: Thao tác phép toán Nhân - Code:
-
#include <stdio.h> #include <conio.h> int m,n,chdaichung,nho=0,s,i,j,a[100],b[100],c[100]; void Nhan(int *a,int *b) { chdaichung=m+n-1; for(i=0;i<chdaichung;i++) { s=0; for(j=0;j<=i;j++) s+=a[j]*b[i-j]; c[i]=(s+nho)%10; nho=(s+nho)/10; } if(nho>0) c[chdaichung++]=nho; } void Input() { printf("Nhap so cac chu so cua a: "); scanf("%d",&m); printf("\nNhap so a (cac chu so cach nhau space): "); for(i=m-1;i>=0;i--) scanf("%d",&a[i]); printf("\n\nNhap so cac chu so cua b: "); scanf("%d",&n); printf("\nNhap so b (cac chu so cach nhau space): "); for(i=n-1;i>=0;i--) scanf("%d",&b[i]); while((a[m-1]==0)&&(m>0)) m--; if(m==0) a[m++]=0; while((b[n-1]==0)&&(n>0)) n--; if(n==0) b[n++]=0; } int main() { Input(); for(i=1;i<=n;i++) a[m-1+i]=0; for(i=1;i<=m;i++) b[n-1+i]=0; Nhan(a,b); for(i=chdaichung-1;i>=0;i--) printf("%d",c[i]); getch(); return 0; } hoặc - Code:
-
#include<stdio.h> #include<conio.h> #include<ctype.h> #include<string.h> int n1,n2,n; int s1[1000],s2[1000]; char s[1000]; void nhan(void); main() { int i; printf("chuong trinh nhan so lon\n"); printf("so thu nhat: "); gets(s); n1=strlen(s)-1; for (i=0;i<=n1;i++) s1[n1-i]=s[i]-48; printf("so thu hai: "); gets(s); n2=strlen(s)-1; for (i=0;i<=n1;i++) s2[n2-i]=s[i]-48; printf("\ntich la: "); nhan(); getch(); } void nhan(void) { int nho,i,bac,tich,j; int tong[1000]={0},tg[1000]={0}; int nmax,ntg; n=0;bac=1;tich=1;nho=0;nmax=0; for (j=0;j<=n2;j++) { bac=j; for (i=0;i<=n1;i++) { tich=s1[i]*s2[j]+nho; tg[i+bac]=tich%10; nho=tich/10; } ntg=n1+bac; while (nho) { ntg++; tg[ntg]=nho%10; nho/=10; } for (i=bac;i<=ntg;i++) { tong[i]+=tg[i]+nho; nho=tong[i]/10; tong[i]%=10; } while (nho) { ntg++; tong[ntg]=tong[ntg]+nho%10; nho=nho/10; } if (ntg>nmax) nmax=ntg; } for (i=nmax;i>=0;i--) printf("%d",tong[i]); } Phần 4: Thao tác toán Chia - Code:
-
#include <stdio.h> #include <conio.h> int m,n,i,j,Tam,d,t,a[100],b[100],c[100]; bool duoc; bool Sosanh(int *a,int*b,int d) { int i; if((a[d-1]!=0)&&(d>0)) return true; for(i=0;i<n;i++) if(a[i+d]>b[i]) return true; else if(a[i+d]<b[i]) return false; return true; } void Tru(int *a,int*b,int d) { int i,nho; nho=0; for(i=n-1;i>=0;i--) if(a[i+d]-nho<b[i]) { a[i+d]=a[i+d]+10-nho-b[i]; nho=1; } else { a[i+d]=a[i+d]-nho-b[i]; nho=0; } if(nho==1) a[d-1]--; } void Ktraso0() { duoc=true; int j=0,k; while((b[j]==0)&&(j<n)) j++; if(j==n) duoc=false; else { for(k=j;k<n;k++) b[k-j]=b[k]; n-=j; } j=0; while((a[j]==0)&&(j<m)) j++; if(j==m) { m=1;a[0]=0; } else { for(k=j;k<m;k++) a[k-j]=a[k]; m-=j; } } void Chia(int *a,int *b) { if(m>=n) { if(!Sosanh(a,b,d)) d++; while(d<=m-n) { Tam=0; while(Sosanh(a,b,d)) { Tam++; Tru(a,b,d); } c[t++]=Tam; d++; if(a[i]==0) i++; } if(t==0) c[t++]=0; } else c[t++]=0; while((a[i]==0)&&(i<m)) i++; if(i==m) a[--i]=0; } int main() { printf("Nhap so cac chu so cua a: "); scanf("%d",&m); printf("\nNhap so a (cac chu so cach nhau bang space): "); for(i=0;i<m;i++) scanf("%d",&a[i]); printf("\n\nNhap so cac chu so cua b: "); scanf("%d",&n); printf("\nNhap so b (cac chu so cach nhau bang space): "); for(i=0;i<n;i++) scanf("%d",&b[i]); d=0; i=0; t=0; Ktraso0(); if(duoc) { Chia(a,b); printf("\nThuong cua phep chia la: "); for(j=0;j<t;j++) printf("%d",c[j]); printf("\nSo du cua phep chia: "); for(j=i;j<m;j++) printf("%d",a[j]); } else printf("Chia cho 0!!!! Vui long lam lai...."); getch(); return 0; } | |
|