Ai giỏi c++ cho em hỏi một tí

Đăng bởi: DarkLight

Ngày đăng  08:28 14/03/2018

Em đang làm bài tập xâu kí tự.

Đề bài là tạo chương trình thực hiện phép cộng và phép nhân hai số nguyên có trên 20 chữ số. Em thực hiện xong ý tưởng rồi nhưng không hiểu sao có một đoạn không có hiệu lực, ra kết quả cuối cùng sai. Xin các bác kiểm tra giúp:

#include<stdio.h>
void nhap(char a[]){
char c;
int i= 0;
do{
c= getchar();
a[i]= c;
i++;
}while(c!= '\n');
if(i<21){
int y;
for(y= 18; y>= 20-i; y--){
a[y]= a[y-20+i];
if(a[y]<48 || a[y]>57){
a[y]= 48;
}
}
for(y= 0; y< 20-i; y++){
a[y]= 48;
}
}
}

int main(){
char a[21], b[21], c[21];
char d[40];
printf("Nhap so a va b toi da 19 ki tu.");
//Nhap a.
printf("\nNhap so a: ");
nhap(a);
//Nhap b.
printf("Nhap so b: ");
nhap(b);
//Tao mang c co tat ca cac phan tu= '0'.
int i;
for(i=0;i<=19;i++){
c[i]= 48;
}
//Tinh tong c= a+b.
for(i= 19; i>= 1; i--){
c[i]+= a[i-1]+b[i-1]-96;
if(c[i]>57){
c[i]-= 10;
c[i-1]+= 1;
}
}
//In phep tinh.
printf("a= %s", a);
printf("\nb= %s", b);
printf("\n _________________________");
printf("\nKet qua a+b= %s", c);



//Tao mang d co tat ca cac phan tu= '0'.
for(i=0;i<=37;i++){
d[i]= 48;
}
//Tinh tich d= a*b.
int m, n;
for(m= 18; m>= 0; m--){
for(n= 18; n>= 0; n--){
d[m+n+1]+= (a[m]-48)*(b[n]-48);
if(d[m+n+1]>57){
int q= (d[m+n+1]-48)/10;
d[m+n+1]-= q*10;
d[m+n]+= q;
if(d[m+n]>57){
int q= (d[m+n]-48)/10;
d[m+n]-= q*10;
d[m+n-1]+= q;
}
}
}
}
//In ket qua phep nhan.
printf("\nKet qua a*b= %s", d);
return 0;
}

  Update vào lúc 08:45 14/03/2018

670 lượt xem

30 Lời bình

Đăng lời bình

Hãy đăng nhập để đăng lời bình

Bài viết mới nhất


Develop by ITE Group