Bạn có thể làm giống như cộng hai số từ lúc bạn học lớp 3 đó.
Ý tưởng của mình là bạn có thể cộng giống như học sinh tiểu học làm đó
Đây là source mà mình có code cả cộng trừ nhân luôn đó, còn phần chia 2 số, nó hơi phức tạp mình chưa biết, có gì chúng ta cùng nhau thảo luận thêm.
Mã:
#include <stdio.h>
#include <string.h>
#include "iostream"
#define MAX 1000
typedef struct
{
int ChuSo[MAX];
int SoChuSo;
bool SoAm; // bang true neu la so am
} SoNguyen;
typedef struct
{
int ChuSo[MAX];
int SoChuSo;
} SoDuong;
void XuatSo(SoNguyen x)
{
int i;
if (x.SoAm) printf("-");
for(i= x.SoChuSo-1; i>= 0; i--)
printf("%d", x.ChuSo[i]);
printf("
");
}
SoNguyen NhapSo(char* s)
{
SoNguyen x;
x.SoAm = false;
int k = 0;
if (s[0]== '-')
{
x.SoAm = true;
k = 1; // neu la so am thi ky tu 1 moi la so
}
int i;
int len = strlen(s);
for(i= len- 1; i>=k; i--)
x.ChuSo[len- i- 1] = s[i] - 48;
x.SoChuSo = len - k;
return x;
}
SoDuong ABS(SoNguyen x) // lay tri tuyet doi la so duong
{
int i;
SoDuong a;
a.SoChuSo = x.SoChuSo;
for(i= 0; i< a.SoChuSo; i++)
a.ChuSo[i] = x.ChuSo[i];
return a;
}
SoNguyen DuongToNguyen(SoDuong a) // doi tu so duong sang so nguyen
{
SoNguyen x;
x.SoAm = false;
x.SoChuSo = a.SoChuSo;
int i;
for(i= 0; i< x.SoChuSo; i++)
x.ChuSo[i] = a.ChuSo[i];
return x;
}
// neu a< b: return -1
// a= b: return 0
// a> b: return 1
int SoSanh(SoDuong a, SoDuong b)
{
if (a.SoChuSo < b.SoChuSo) return -1;
else
if (a.SoChuSo > b.SoChuSo) return 1;
else
{
int i = a.SoChuSo - 1;
while (i>=0 && a.ChuSo[i]== b.ChuSo[i]) i--;
if (i== -1) return 0;
else
if (a.ChuSo[i] < b.ChuSo[i]) return -1;
else return 1;
}
}
SoDuong CongTay(SoDuong a, SoDuong b) // thuc hien phep cong tay
{
SoDuong c;
int nho = 0, kq;
int max;
int i;
if (a.SoChuSo > b.SoChuSo)
{
max = a.SoChuSo;
for(i= b.SoChuSo; i<max; i++)
b.ChuSo[i] = 0;
}
else
{
max = b.SoChuSo;
for(i= a.SoChuSo; i<max; i++)
a.ChuSo[i] = 0;
}
for(i = 0; i< max; i++)
{
kq = a.ChuSo[i]+ b.ChuSo[i] + nho;
c.ChuSo[i] = kq % 10;
nho = kq / 10;
}
if (nho== 0)
c.SoChuSo = max;
else
{
c.SoChuSo = max+1;
c.ChuSo[max] = nho;
}
return c;
}
// a phai lon hon b
SoDuong TruTay(SoDuong a, SoDuong b) // thuc hien phep tru tay
{
SoDuong c;
int muon = 0, kq;
int vitricuoi = 0;
int i;
for(i= b.SoChuSo; i< a.SoChuSo; i++)
b.ChuSo[i] = 0;
for(i = 0; i< a.SoChuSo; i++)
{
kq = a.ChuSo[i] - (b.ChuSo[i] + muon);
if (kq<0)
{
kq = kq + 10;
muon = 1;
}
else
muon = 0;
c.ChuSo[i] = kq;
if (kq!= 0) vitricuoi = i; // vi du 1234 - 1200 = 0034 thi vi tri cuoi se nho lai vi tri so 3
}
c.SoChuSo = vitricuoi + 1;
return c;
}
SoDuong NhanTay1Den9(SoDuong a, int n) // thuc hien phep nhan tay voi so tu 1 --> 9
{
SoDuong b;
int nho = 0, kq;
int i;
for(i = 0; i< a.SoChuSo; i++)
{
kq = a.ChuSo[i]* n + nho;
b.ChuSo[i] = kq % 10;
nho = kq / 10;
}
if (nho == 0)
b.SoChuSo = a.SoChuSo;
else
{
b.ChuSo[a.SoChuSo] = nho;
b.SoChuSo = a.SoChuSo + 1;
}
return b;
}
SoDuong NhanTay10(SoDuong a) // thuc hien phep nhan tay voi 10
{
SoDuong b;
b.ChuSo[0] = 0;
int i;
for(i = 0; i< a.SoChuSo; i++)
b.ChuSo[i+1] = a.ChuSo[i];
b.SoChuSo = a.SoChuSo + 1;
return b;
}
SoDuong NhanTay(SoDuong a, SoDuong b) // thuc hien phep nhan tay
{
SoDuong c;
c.ChuSo[0]= 0;
c.SoChuSo = 1;
int i,j;
for(i=0; i< b.SoChuSo; i++)
if (b.ChuSo[i]!= 0)
{
SoDuong k = NhanTay1Den9(a, b.ChuSo[i]);
for(j=0; j< i; j++)
k = NhanTay10(k);
c = CongTay(c, k);
}
return c;
}
SoNguyen Cong(SoNguyen x, SoNguyen y)
{
SoDuong a = ABS(x);
SoDuong b = ABS(y);
SoNguyen z;
SoDuong c;
if (x.SoAm == y.SoAm) // neu x va y cung duong hay am
{
c = CongTay(a, b);
z = DuongToNguyen(c);
z.SoAm = x.SoAm;
}
else
{
int ss = SoSanh(a, b);
if (ss == -1) // a < b
c = TruTay(b, a);
else
c = TruTay(a, b);
z = DuongToNguyen(c);
if (x.SoAm) // neu x am y duong
{
if (ss== -1)
z.SoAm = false; // neu x am y duong va |x|<|y| thi ket qua la so duong
else
z.SoAm = true;
}
else // neu x duong y am
{
if (ss== -1)
z.SoAm = true; // neu x duong y am va |x|<|y| thi ket qua la so am
else
z.SoAm = false;
}
}
return z;
}
SoNguyen Tru(SoNguyen x, SoNguyen y)
{
if (y.SoAm) y.SoAm = false;
else y.SoAm = true;
return Cong(x, y);
}
SoNguyen Nhan(SoNguyen x, SoNguyen y)
{
SoDuong a = ABS(x);
SoDuong b = ABS(y);
SoNguyen z;
SoDuong c;
c = NhanTay(a, b);
z = DuongToNguyen(c);
if (x.SoAm== y.SoAm) // nhan 2 so cung dau ket qua la duong
z.SoAm = false;
else
z.SoAm = true;
return z;
}
int main()
{
SoNguyen x, y, z;
char s[MAX];
//printf("Nhap x: ");
gets(s);
x = NhapSo(s);
//printf("Nhap y: ");
gets(s);
y = NhapSo(s);
printf("Tong: ");
z = Cong(x, y);
//printf("
x+y = ");
XuatSo(z);
printf("Hieu: ");
z = Tru(x, y);
//printf("
x-y = ");
XuatSo(z);
printf("Tich: ");
z = Nhan(x, y);
//printf("
x*y = ");
XuatSo(z);
getchar();
return 0;
}
Chúc may mắn.
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...