Nhân hai số nguyên lớn
» Nhân hai sô nguyên lớn, Chia hai số nguyên lớn, Cộng hai số nguyên lớn, Trừ hai số nguyên lớn trong C++
» Xử Lý Tín Hiệu Số
» Giáo trình Vi xử lý - vi xử lý 8086 - vi xử lý 8088
» An Toàn Dữ Liệu, An toàn và bảo mật hệ thống thông tin
» Bài Tập Ngôn Ngữ Lập Trình LISP - JAVA
» Câu Hỏi Ôn Tập Môn Truyền Thông Đại Chúng Phần II
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#define MAXLEN 1000
struct SNL
{
char sign; // Dấu, Nếu số âm thì sign= -1;
char len; // Độ dài của xâu số
char num[MAXLEN]; // Mảng ký tự num để lưu các chữ số
};
// Khai báo các nguyên mẫu hàm
void initSNL(SNL &n); // Hàm khởi tạo 1 số nguyên lớn
void str2snl(char *str, SNL &n); // Hàm chuyển 1 chuỗi ký tự thành số nguyên lớn
void scanSNL(SNL &n); // Hàm đọc vào 1 số nguyên lớn từ bàn phím
void printSNL(SNL &n); // Hàm 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); // Hàm so sánh 2 số nguyên lớn, Nếu a>b trả về 1, a=b trả về 0, a<b trả về -1
void mul(SNL &r, SNL &a, SNL &b); // Nhân 2 số nguyên lớn
void InitSNL(SNL &n)
{
for (int i=0; i<MAXLEN; i++) n.num[i]=0;
n.len=0;
n.sign=1;
}
void str2snl(char *str, SNL &n)
{
int i;
if (str[0]=='-')
{
n.sign= -1;
str++; // Bỏ qua ký tự đầu tiên
}
else
n.sign=1;
while (str[0] == '0') ++str; // Bỏ qua các chữ số 0 ở đầu
n.len=strlen(str); // Chiều dài (Số chữ số) của số nguyên lớn
for (i=0; i<n.len; i++)
n.num[i]=str[n.len-i-1]-'0'; // Chuyển từng ký tự thành số
}
int cmpu(SNL &a, SNL &b)
{
if (a.len>b.len) // So sánh độ dài xâu a mà lớn hơn xâu b thì trả về 1
return 1;
else if (a.len < b.len) // Ngược lại trả về -1
return -1;
else
{
int len= a.len -1;
while (len >= 0)
{
if (a.num[len] > b.num[len])
return 1;
else if (a.num[len] < b.num[len])
return -1;
else
len--;
}
}
return 0;
}
int cmp(SNL &a, SNL &b)
{
if (a.sign * b.sign<0) return a.sign;
return a.sign * cmpu(a,b);
}
void scanSNL(SNL &n) // Hàm đọc số nguyên lớn từ bàn phím
{
char *t=new char[MAXLEN];
cin>>t;
str2snl(t,n);
delete []t;
}
void printSNL(SNL &n) // Hàm in số nguyên lớn ra màn hình
{
if (n.len > 0)
{
if (n.sign<0) cout<<"-";
for (int i=n.len-1; i>=0; i--) cout<<(int)n.num[i];
}
else
cout << 0;
}
void mul(SNL &r, SNL &a, SNL &b) // Hàm nhân hai số nguyên lớn
{
InitSNL(r);
for (int i=0; i<b.len; i++)
for (int j=0; j<b.num[i]; j++)
for (int k=0; k<a.len; k++)
{
r.num[k+i] += a.num[k];
if (r.num[k+i]>9)
{
r.num[k+i] -= 10;
r.num[k+i+1]++;
}
}
r.len=a.len+b.len;
while (r.num[r.len-1]==0) r.len--;
r.sign=a.sign*b.sign;
}
int main()
{
SNL a,b,c;
InitSNL(a);
InitSNL(b);
InitSNL(c);
system("cls");
cout<<"Nhap so nguyen a: "; scanSNL(a);
cout<<"Nhap so nguyen b: "; scanSNL(b);
mul(c,a,b);
cout<<endl<<"a * b = "; printSNL(c);
cout<<endl;
getch();
return 0;
}
» Xử Lý Tín Hiệu Số
» Giáo trình Vi xử lý - vi xử lý 8086 - vi xử lý 8088
» An Toàn Dữ Liệu, An toàn và bảo mật hệ thống thông tin
» Bài Tập Ngôn Ngữ Lập Trình LISP - JAVA
» Câu Hỏi Ôn Tập Môn Truyền Thông Đại Chúng Phần II
Giới Thiêu:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#define MAXLEN 1000
struct SNL
{
char sign; // Dấu, Nếu số âm thì sign= -1;
char len; // Độ dài của xâu số
char num[MAXLEN]; // Mảng ký tự num để lưu các chữ số
};
// Khai báo các nguyên mẫu hàm
void initSNL(SNL &n); // Hàm khởi tạo 1 số nguyên lớn
void str2snl(char *str, SNL &n); // Hàm chuyển 1 chuỗi ký tự thành số nguyên lớn
void scanSNL(SNL &n); // Hàm đọc vào 1 số nguyên lớn từ bàn phím
void printSNL(SNL &n); // Hàm 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); // Hàm so sánh 2 số nguyên lớn, Nếu a>b trả về 1, a=b trả về 0, a<b trả về -1
void mul(SNL &r, SNL &a, SNL &b); // Nhân 2 số nguyên lớn
void InitSNL(SNL &n)
{
for (int i=0; i<MAXLEN; i++) n.num[i]=0;
n.len=0;
n.sign=1;
}
void str2snl(char *str, SNL &n)
{
int i;
if (str[0]=='-')
{
n.sign= -1;
str++; // Bỏ qua ký tự đầu tiên
}
else
n.sign=1;
while (str[0] == '0') ++str; // Bỏ qua các chữ số 0 ở đầu
n.len=strlen(str); // Chiều dài (Số chữ số) của số nguyên lớn
for (i=0; i<n.len; i++)
n.num[i]=str[n.len-i-1]-'0'; // Chuyển từng ký tự thành số
}
int cmpu(SNL &a, SNL &b)
{
if (a.len>b.len) // So sánh độ dài xâu a mà lớn hơn xâu b thì trả về 1
return 1;
else if (a.len < b.len) // Ngược lại trả về -1
return -1;
else
{
int len= a.len -1;
while (len >= 0)
{
if (a.num[len] > b.num[len])
return 1;
else if (a.num[len] < b.num[len])
return -1;
else
len--;
}
}
return 0;
}
int cmp(SNL &a, SNL &b)
{
if (a.sign * b.sign<0) return a.sign;
return a.sign * cmpu(a,b);
}
void scanSNL(SNL &n) // Hàm đọc số nguyên lớn từ bàn phím
{
char *t=new char[MAXLEN];
cin>>t;
str2snl(t,n);
delete []t;
}
void printSNL(SNL &n) // Hàm in số nguyên lớn ra màn hình
{
if (n.len > 0)
{
if (n.sign<0) cout<<"-";
for (int i=n.len-1; i>=0; i--) cout<<(int)n.num[i];
}
else
cout << 0;
}
void mul(SNL &r, SNL &a, SNL &b) // Hàm nhân hai số nguyên lớn
{
InitSNL(r);
for (int i=0; i<b.len; i++)
for (int j=0; j<b.num[i]; j++)
for (int k=0; k<a.len; k++)
{
r.num[k+i] += a.num[k];
if (r.num[k+i]>9)
{
r.num[k+i] -= 10;
r.num[k+i+1]++;
}
}
r.len=a.len+b.len;
while (r.num[r.len-1]==0) r.len--;
r.sign=a.sign*b.sign;
}
int main()
{
SNL a,b,c;
InitSNL(a);
InitSNL(b);
InitSNL(c);
system("cls");
cout<<"Nhap so nguyen a: "; scanSNL(a);
cout<<"Nhap so nguyen b: "; scanSNL(b);
mul(c,a,b);
cout<<endl<<"a * b = "; printSNL(c);
cout<<endl;
getch();
return 0;
}