Xử lý tính toán với 2 số nguyên lớn có thể đến hàng trăm chữ số

Dùng mảng 1 chiểu để lưu trữ
1. Viết 1 chương trình nhập vào 2 số nguyên lớn (có thể đến hàng trăm chữ số)
2. Thực hiện phép toán trên 2 số đó:
a.So sánh
b.cộng
c.trừ
3.Thực hiện phép nhân,phép chia số nguyên lớn đối với số nguên hoặc số nguyên lớn đối với số nguyên lớn(bonus)


Gợi ý:
Nhập vào N1,N2 là 1 dãy kí tự char n1[300]
Chuyển vào mảng số bằng cách-'0'
N1 có 9 kí tự.N2 có 3 kí tự.Gọi chieudaimax là số phần tử của mảng có nhiều phần tử hơn.
N1:123456789
N2:123
N1:
n2:
kq: +
kq: n1 –n2
kq: n2-n1
Cộng: Ta sẽ cộng từng giá trị từ cuối mảng trở về trước. kết quả sẽ được lưu trong mảng kq. Mảng kq sẽ có max+1 phần tử. Và sẽ có biến nhớ để lưu giá trị của từng phép cộng của các phần tử.
Trừ: Từ phép so sánh ta sẽ lấy phần tử lớn trừ phần tử nhỏ, nếu là trường hợp nhỏ trừ lớn sẽ xuất ra dấu – trước kết quả. Ta sẽ có biến nhớ để lưu có mượn hay không?
Nhân: Để đơn giản ta có thể lặp đi lặp lại phép cộng nhiều lần. Ví dụ: a*3 = a+a+a
Chia: Để đơn giản ta có thể dùng phép trừ.
Ví dụ: 16/3
Kiểm tra số 16 có lớn hơn 3 hay không? Nếu không à kq = 0
3*1=3 < 16: tiếp tục lặp cho đến khi được tích >= số bị chia
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
18>16 à xuất 6-1 = 5

 Demo:

#include <iostream>using namespace std#include <conio.h>class nguyenduong{
private:
    
char x[200];
public:
    
friend istreamoperator>>(istream&,nguyenduong&);
    
friend ostreamoperator<<(ostream&,nguyenduong);
    
friend nguyenduong operator+(nguyenduong,nguyenduong);
    
friend bool operator>(nguyenduong,nguyenduong);
    
friend bool operator>=(nguyenduong,nguyenduong);
    
friend bool operator<(nguyenduong,nguyenduong);
    
friend bool operator<=(nguyenduong,nguyenduong);
    
friend bool operator==(nguyenduong,nguyenduong);
    
friend bool operator!=(nguyenduong,nguyenduong);
};
int xstrlen(char *xau)
{
    
int i=0;
    while (
xau[i])i++;
    return 
i;
}
ostreamoperator<<(ostreamo,nguyenduong x)
{
    return 
o<<x.x;
}
istreamoperator>>(istream &i,nguyenduong &x)
{
    return 
i>>x.x;
}
void chenkitu(char *xau ,int vitri=0char chen='0'//vi tri bat dau tu 0  {
    for (
int i=xstrlen(xau)+1;i>vitri;i--)   xau[i]=xau[i-1];
    
xau[vitri]=chen;
}  
void xoakitu(char *xau,int vitri=0//vi tri bat dau tu 0{
    for(
int i=vitri;i<=xstrlen(xau);i++) xau[i]=xau[i+1];
}
void canbang(char *a,char *b)
{
    
int ai=xstrlen(a),bi=xstrlen(b);
    
char *p=ai>bi?b:a;
    if (
ai!=bi)
        for (
int i=(ai>bi?ai:bi)-xstrlen(p);i>0;i--) chenkitu(p);
    
chenkitu(a);chenkitu(b);
}  
void tong(char *a,char *b,char *s,int i=0)   // bước đệm cho toán tử +, giống như vscanf và scanf vậy{                                              // sử dụng đệ quy để tính tổng 2 chuỗi
    
static int temp=0;
    if (
i<xstrlen(a)) tong(a,b,s,i+1);
    if (
a[i]==NULLs[i]=NULL;
        else
        {
            
s[i]=a[i]+b[i]+temp-'0';
            if (
s[i]>'9's[i]-=10,temp=1;
                else 
temp=0;
        }
}  
nguyenduong operator+(nguyenduong anguyenduong b)
{
    
nguyenduong s;
    
canbang(a.x,b.x);
    
tong(a.x,b.x,s.x);
    
xoakitu(a.x);
    
xoakitu(b.x);
    if (
s.x[0]='0'xoakitu(s.x);
    return 
s;
}
int sosanhf(char *a,char *b,int i=0// a>b trả về 1 , a<b trả về -1 , a==b trả về 0{
    if (
i==xstrlen(a)) return 0;
    else if (
a[i]>b[i]) return 1;
    else if (
a[i]<b[i]) return -1;
    else return 
sosanhf(a,b,i+1);
}
int sosanh(char *a,char *b)
{
    
canbang(a,b);
    
int temp=sosanhf(a,b);
    
xoakitu(a);    xoakitu(b);  
    return 
temp;
}
bool operator>(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x)==1)    return 1;
    else return 
0;
}
bool operator>=(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x)>=0)    return 1;
    else return 
0;
}
bool operator<(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x)==-1)    return 1;
    else return 
0;  
}
bool operator<=(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x)<=0)    return 1;
    else return 
0;  
}
bool operator==(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x)) return 0;
    else return 
1;  
}
bool operator!=(nguyenduong a,nguyenduong b)
{
    if (
sosanh(a.x,b.x))    return 1;
    else return 
0;  
}
void main(void)
    {
        
nguyenduong a,b;
        
cout<<"Nhap vao 2 so nguyen lon : ";
        
cin>>a>>b;
        
cout<<"Tong 2 so la :"<<a+b;
        if (
a>bcout<<a<<" > "<<b;
        
// ok ?

        
system("pause");
    }  
Ntech Developers

Programs must be written for people to read, and only incidentally for machines to execute.

Post a Comment

Previous Post Next Post