Cách loại bỏ số 0 đầu tiên trong nhân 2 số lớn

Em có đọc trên mạng đoạn code như sau mà mong mọi người giải đáp. Đề là nhân 2 số nguyên lớn.

#include <bits/stdc++.h>

using namespace std;
string s,ss,str="";
 int a[1000],i,j;
int main()
{
  cin>>s>>ss;
   for(i=0;i<=s.size()+ss.size();i++)
    a[i]=0;
   for(i=s.size()-1;i>=0;i--)
   {
       for(j=ss.size()-1;j>=0;j--)
        a[i+j+1]+= (s[i]-'0')+(ss[j]-'0');
   }
   for(i=s.size()+ss.size();i>=0;i--)
   {
       if(a[i]>9)
       {
           a[i-1]+=a[i]/10;
           a[i]%=10;
       }
   }
   for(i=0;i<s.size()+ss.size();i++)
    str+=(a[i]+'0');
   cout<<str;
}

Em không hiểu (s[i]-'0')+(ss[j]-'0'); (a[i]+'0'); là gì ạ. s[i] ss[j], a[i] là các phần từ trong mảng mà sao lại -'0' ?
Và code này chưa có loại bỏ số 0 đầu mảng. Mong mọi người giúp ạ. Em mới học.

Do chuỗi đóng cả hai vai trò lưu trữ và show (n00b :smiley: ) nên phải trừ cho ‘0’ để tính toán.

1 Like

Đó là cách “chuyển” từ kí tự (char) về số nguyên (int) thay vì phải ép kiểu/chuyển đổi.

Kí tự   Mã kí tự
'0'     48
'1'     49
...
'8'     56
'9'     57

Khi đó -'0',... tương đương với -48,...
'0'-'0' = 48-48=0
...
'8'-'0' = 56-48=8
'9'-'0' = 57-48=9

Loại bỏ số không đầu tiên thì chỉ cần xét từ đầu đến cuối nếu xuất hiện thì xóa nó thôi. Xuất hiện đầy tiên và có thể liên tiếp nhiều số ‘0’ sau số ‘0’ đầu tiên thì xóa.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?