PDA

View Full Version : Tính tích 2 số nguyên a, b rất lớn chạy sai, giúp mình sửa?



duahauanhyeu
01-11-2011, 04:19 PM
Mình xin các bạn góp ý. Kết quả của mình bị sai. Mình tìm hoài không thấy lỗi ở chỗ nào cả.
Đề bài là: Viết chương trình nhập vào 2 số nguyên a,b(a,b co từ 20 chữ số trở lên). Tính tích 2 số đó.


#include<stdio.h>
#include<conio.h>
void nhap(int a[],int &n)
{
for(int i=0; i<=2*n; i++)
a[i] = 0 ;
for(i=1;i<=n;i++)
{
do{
printf("Nhap a[%d]:",i);
scanf("%d",&a[i]);
}while(a[i]/10!=0);
}
}
void nhapb(int b[],int &n)
{
for(int i=0; i<=2*n; i++)
b[i] = 0 ;
for(i=1;i<=n;i++)
{
do{
printf("Nhap b[%d]:",i);
scanf("%d",&b[i]);
}while(b[i]/10!=0);
}
}
void tich(int a[],int b[],int c[],int d[],int n)
{
int p=0,demj=0,demi=0;
int dichmang=n-1;
for(int i=1;i<=dichmang;i++)
{
for(int j=2*n-1;j>=1;j--)
{
a[j]=a[j-1];
b[j]=a[j-1];
}
}
printf("Mang a sau khi dich:\n");
for(i = 0; i<2*n; i++)
printf("%d ", a[i]);
printf("\nMang b sau khi dich:\n");
for(i=0;i<2*n;i++)
printf("%d ",b[i]);
//Khoi tao gia tri mang d//

for(i=0;i<2*n;i++)
{
d[i]=0;
}
for(int z=0;z<2*n;z++)
{
c[z]=0;
}
for(int j=2*n-1;j>=n;j--)
{
demi=0;
for(int i=2*n-1;i>=demj;i--)
{
c[i]=(a[i]*b[j])+p;
p=c[i]/10;
c[i]=c[i]%10;
if(j<2*n-1)
{
c[(2*n-1)-demj-demi]=c[i];
}
demi++;
}
p=0;
for(i=2*n-1;i>=0;i--)
{
d[i]=d[i]+c[i]+p;
p=d[i]/10;
d[i]=d[i]%10;
}
p=0;
demj++;
}
printf("\nTich la:");
for(int k=0;k<=2*n-1;k++)
{
printf("%d",d[k]);
}
}
void main()
{
clrscr();
int a[100],b[100],c[100],d[100],n;
printf("Nhap phan tu a:");
scanf("%d",&n);
nhap(a,n);
nhapb(b,n);
tich(a,b,c,d,n);
getch();
}

temece
01-11-2011, 06:35 PM
Mình Không hiểu! nhân hai số thì nhân hai số lại với nhau chứ làm thế làm gì

duahauanhyeu
01-11-2011, 06:48 PM
Bạn ơi đây là số rất lớn nên các kiểu dữ liệu không có đủ bộ nhớ vì thế ta không nhân trực tiếp được.

taymonquang
03-11-2011, 04:43 PM
void nhap(int a[],int &n)
{
for(int i=0; i<=2*n; i++)
a[i] = 0 ;
for(i=1;i<=n;i++)
{
do{
printf("Nhap a[%d]:",i);
scanf("%d",&a[i]);
}while(a[i]/10!=0);
}
}


1/ Đoạn code này bạn dùng để nhập thừa số a. Vậy tại sao bạn lại ko dùng lại để nhập cho thừa số b mà phải viết thêm 1 hàm nhập cho b làm gì khi mà nhập cho a và b đều giống nhau.
2/ Vấn đề của bạn theo mình nghĩ có lẽ không có kiểu dữ liệu cơ bản nào của C++ có thể đáp ứng được => bạn phải tạo ra 1 kiểu dữ liệu mới để lưu trữ cái tích to đùng đó.