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:
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 istream& operator>>(istream&,nguyenduong&);
friend ostream& operator<<(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;
}ostream& operator<<(ostream& o,nguyenduong x)
{
return o<<x.x;
}istream& operator>>(istream &i,nguyenduong &x)
{
return i>>x.x;
}void chenkitu(char *xau ,int vitri=0, char 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]==NULL) s[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 a, nguyenduong 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>b) cout<<a<<" > "<<b;
// ok ?
system("pause");
}
Tags:
DevC