Danh mục

Các phép tính với số nguyên lớn

Số trang: 20      Loại file: pdf      Dung lượng: 169.55 KB      Lượt xem: 19      Lượt tải: 0    
Jamona

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

mã nguồn C++ Cộng, trừ, nhân, chia số nguyên lớn, mã nguồn C++ #include #include using namespace std; #define MAXLEN 1000 struct SNL { char sign;//dấu, nếu số âm thì sign=-1 char len;//chiều dài char num[MAXLEN];//lưu các chữ số }; void initSNL(SNL &n);//Khởi tạo số nguyên lớn void str2snl(char *str, SNL &n);//Chuyển một chuỗi kí tự thành số nguyên lớn void scanSNL(SNL &n);//Đọc số nguyên lớn từ bàn phím void printSNL(SNL &n);//In số nguyên lớn ra màn hình int cmpu(SNL &a, SNL &b);//So sánh 2 số nguyên lớn không xét dấu int cmp(SNL &a, SNL &b);//So sánh 2...
Nội dung trích xuất từ tài liệu:
Các phép tính với số nguyên lớn Các phép tính với số nguyên lớn & mã nguồn C++Cộng, trừ, nhân, chia số nguyên lớn, mã nguồn C++#include #include using namespace std;#define MAXLEN 1000struct SNL{ char sign;//dấu, nếu số âm thì sign=-1 char len;//chiều dài char num[MAXLEN];//lưu các chữ số};void initSNL(SNL &n);//Khởi tạo số nguyên lớnvoid str2snl(char *str, SNL &n);//Chuyển một chuỗi kí tự thành số nguyên lớnvoid scanSNL(SNL &n);//Đọc số nguyên lớn từ bàn phímvoid printSNL(SNL &n);//In số nguyên lớn ra màn hìnhint cmpu(SNL &a, SNL &b);//So sánh 2 số nguyên lớn không xét dấuint cmp(SNL &a, SNL &b);//So sánh 2 số nguyên lớn, nếu a>b trả về 1, a=btrả về 0, a{ int i; if (str[0]==-) { n.sign=-1; str++; //bỏ qua kí tự đầu tiên } else n.sign=1; n.len=strlen(str);//Chiều dài (số chữ số) của số nguyên lớn for (i=0; ib.len)//Số nào dài hơn thì số đó lớn hơn return 1; else if (a.len=0) { //So sánh từ chữ số if (a.num[len]>b.num[len]) return 1; else if (a.num[len] } return 0;}int cmp(SNL &a, SNL &b){ if (a.sign * b.sign>t; str2snl(t,n); delete []t;}void printSNL(SNL &n){ if (n.sign { s.num[i] -= 10; m = 1; } else m = 0; } i f ( m) { s.num[s.len]=1; s.len++; }}void add(SNL &s, SNL &a, SNL &b){ if (a.sign*b.sign>0)//Nếu a và b cùng dấu { addu(s,a,b); s.sign=a.sign;//Dấu của s cũng là dấu của a hoặc b } else { int t=cmpu(a,b); if (t==1) { subu(s,a,b); s.sign=a.sign; } else if (t==-1) { subu(s,b,a); s.sign=b.sign; } else InitSNL(s); }}void subu(SNL &r, SNL &a, SNL &b){ InitSNL(r); r.len=a.len>b.len?a.len:b.len; int m=0; for (int i=0; i for (int j=0; j=b.len) { int blen=b.len; int i; if (a.len>b.len) { i=a.len-1; int x=a.len-b.len; while (i>=0) { if (i>=x) b.num[i]=b.num[i-x]; else b.num[i]=0; i--; } } b.len=a.len; SNL d; i = 1; while (b.len>=blen) { while (cmpu(a,b)>-1) { subu(d,a,b); r.num[r.len-i]++; a = d; } b.len--; i++; for (int k=0; k mul(c,a,b); cout{ char sign; char len; char num[MAXLEN]; friend istream& operator >> (istream&, BigInt&); friend ostream& operator = (const BigInt&) const; bool operator > (const BigInt&) const; bool operator BigInt operator + (const BigInt&) const; BigInt operator - (const BigInt&) const; BigInt operator * (const BigInt&) const; BigInt operator / (const BigInt&) const; BigInt operator % (const BigInt&) const; BigInt operator - () const; BigInt& operator ++ (); BigInt operator ++ (int); BigInt& operator -- (); BigInt operator -- (int); ~BigInt();};#endifTập tin BigInt.cpp//(c) http://kithuatlaptrinh.tk#include BigInt.histream& operator >> (istream& inDev, BigInt& n){ return n.read(inDev);}ostream& operator > strTemp; getSz(strTemp); delete []strTemp; return inDev;}void BigInt::getInt(int n){ char strTemp[10]; _itoa_s(n, strTemp, 10); getSz(strTemp);}void BigInt::getSz(const char* str){ init(); if (str[0] == -) { sign = -1; ++str; } else sign = 1; len = strlen(str); for (int i = 0; i < len; ++i) num[i] = str[len - i - 1] - 0;}ostream& BigInt::write(ostream& outDev){ if (sign < 0) outDev 0) for (int i = len - 1; i >= 0; --i) outDev return outDev;}void BigInt::init(){ sign = 1; len = 0; for (int i = 0; i < MAXLEN; ++i) num[i] = 0;}BigInt::BigInt(){ init();}BigInt::BigInt(int n){ getInt(n);}BigInt::BigInt(const char* str){ getSz(str);}BigInt& BigInt::operator = (const BigInt& n){ len = n.len; sign = n.sign; for (int i = len - 1; i >=0; --i) num[i] = n.num[i]; return *this;}BigInt& BigInt::operator = (const char* str){ getSz(str); return *this;}BigInt& BigInt::operator = (int n){ getInt(n); return *this;}int BigInt::cmpu(const BigInt &n) const{ if (len > n.len) return 1; else if (len < n.len) return -1; else { int t = len - 1; while (t >= 0) { if (num[t] > n.num[t]) return 1; else if (num[t] < n.num[t]) return -1; else --t ; } } return 0;}int BigInt::cmp(const BigInt &n) const{ if (sign * n.sign < 0) return sign; return sign * cmpu(n);}bool BigInt::operator == (const BigInt& n) const{ return cmp(n) == 0;}bool BigInt::operator != (const BigInt& n) const{ return cmp(n) != 0;}bool BigInt::operator < (const BigInt& n) const{ return cmp(n) < 0;}bool BigInt::operator >= (const BigInt& n) const{ return cmp(n) >= 0;}bool BigInt::operator > (const BigInt& n) const{ return cmp(n) > 0;}bool BigInt::operator { r.num[i] = num[i] + n.num[i] + m; if (r.num[i] > 9) { r.num[i] -= 10; m = 1; } else m = 0; } i f (m ) { r.num[r.len] = 1; r.len++; } return r;}BigInt& BigInt::subu(const BigInt& n, BigInt& r) const{ r.len = len > n.len ? len : n.len; int m = 0; for (int i = 0; i < r.len; ++i) { if (num[i] < n.num[i] + m) { r.num[i] = 10 + num[i] - n.num[i] - m; m = 1; } else { r.num[i] = num[i] - n.num[i] - m; m = 0; } } while (r.num[r.len - 1] == 0) --r.len; return r; ...

Tài liệu được xem nhiều:

Tài liệu cùng danh mục:

Tài liệu mới: