18/8/2011, 1:50 pm
Mình đã đọc ở đâu đó bạn Admin có nói đến thi Olympic, mình muốn mở topic này để anh em vào chém gió nhé.
Trong kỹ thuật lập trình chúng ta thường chỉ lập trình với các số bé (khoảng 10^34). Nhưng trong các kỳ thi Olympic mình thấy họ hay ra bài toán giải quyết các số lớn (khoảng vài trăm ....chữ số). Ai giải quyết giúp mình về các vấn đề nhân, chia, cộng, trừ các số lớn nhé.
Mình đã tìm hiểu cái giải thuật này thấy nó hay hay. Ai cho ý kiến nhé:
Trong kỹ thuật lập trình chúng ta thường chỉ lập trình với các số bé (khoảng 10^34). Nhưng trong các kỳ thi Olympic mình thấy họ hay ra bài toán giải quyết các số lớn (khoảng vài trăm ....chữ số). Ai giải quyết giúp mình về các vấn đề nhân, chia, cộng, trừ các số lớn nhé.
Mình đã tìm hiểu cái giải thuật này thấy nó hay hay. Ai cho ý kiến nhé:
#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("nnNhap 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("nnTong la: n"); for(i=m-1;i>=0;i--) //Buoc 4: Xuat ket qua printf("%d",c[i]); getch(); return 0; } |