A
akickdoe22
Please help me finish this program. i have completed the addition and
the subtraction parts, but i am stuck on the multiplication and
division. any suggestions, hints, code, anyhting. it's not a true large
int calculator, the numbers entered are at max 100 intergers.
CODE SO FAR:
#include<iostream> //libraries limited to
#include<string>
using namespace std;
class INT {
int digits[100];
char sign;
public:
INT( ) {
sign = 'p';
for (int a=0; a<100; a++)
digits[a] = 0;
}
INT(int num) {
int a;
for (a=0; a<100; a++) digits[a] = 0;
if (num < 0) { sign = 'n'; num = num * -1; }
else sign = 'p';
a = 99;
while (num > 0) {
digits[a] = num % 10;
num = num / 10;
a = a - 1;
}
}
friend INT operator+(const INT&, const INT&);
friend INT operator-(const INT&, const INT&); // new
friend INT operator*(const INT&, const INT&); // new
friend INT operator/(const INT&, const INT&); // new
friend ostream& operator<<(ostream&, const INT&);
friend istream& operator>>(istream&, INT&);
};
ostream& operator<< (ostream& os, const INT& num) {
int a = 0;
if (num.sign == 'n') os << '-';
while (a < 99 && num.digits[a] == 0)
a++;
while (a < 100)
os << num.digits[a++];
return os;
}
istream& operator>> (istream& is, INT& num) {
string number;
is >> number;
if (number.at(0) == '-') num.sign='n';
if (number.at(0) == '+') num.sign='p';
int start = 0;
if ( !isdigit(number.at(0)) ) start = 1;
int loc = 100-(number.length()-start);
for (int a=start; a<number.length(); a++)
num.digits[loc++] = number.at(a) - '0';
return is;
}
INT operator+(const INT& x, const INT& y) {
INT result, larger, smaller;
if (x.sign == y.sign) {
result.sign = x.sign;
int a, carry = 0, total;
for (a=99; a>=0; a--) {
total=x.digits[a]+y.digits[a]+carry;
if (total > 9) carry = 1;
else carry = 0;
result.digits[a] = total % 10;
}
}
else {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
if (flag) { // add them unless flag is false (the two were equal)
for (int b=99; b>=0; b--) {
if (smaller.digits > larger.digits) { // need to borrow
int c = b-1;
while (larger.digits[c] == 0) {
larger.digits[c] = 9;
c = c - 1;
}
larger.digits[c] = larger.digits[c] - 1;
larger.digits = larger.digits + 10;
}
result.digits = larger.digits - smaller.digits;
}
}
}
return result;
}
INT operator-(const INT& x, const INT& y) {
INT result, larger, smaller;
if (x.sign != y.sign) {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
if(x.digits[a] == y.digits[a]){ result.sign = x.sign; }//my sign
config.
else
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
int carry = 0, total;
for (a=99; a>=0; a--) {
total=x.digits[a]+y.digits[a]+carry;
if (total > 9) carry = 1;
else carry = 0;
result.digits[a] = total % 10;
}
}
else {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
if (flag) { // add them unless flag is false (the two were equal)
for (int b=99; b>=0; b--) {
if (smaller.digits > larger.digits) { // need to borrow
int c = b-1;
while (larger.digits[c] == 0) {
larger.digits[c] = 9;
c = c - 1;
}
larger.digits[c] = larger.digits[c] - 1;
larger.digits = larger.digits + 10;
}
result.digits = larger.digits - smaller.digits;
}
}
}
return result;
}
INT operator*(const INT& x, const INT& y) {
INT result;
int mul_top[100];
int mul_bottom[100];
// int ans[200];
for (int a=99; a>=0; a--)
mul_top[a] = x.digits[a]; //want to copy arrays
for (int a=99; a>=0; a--)
mul_bottom[a] = y.digits[a];
//for (int c=0; c<200; c++) //want 2 find lenghts of #s
// ans[c] = 0; //4 for loops. set e,d = to #s
int c=200, carry=0, total=0; //don't know if .digits or
..ans should b returned
for (int d=99; d>=mul_bottom.lenght(); d--){
for(int e=99; e>=mul_top.lenght(); e--){
total=mul_top[e]*mul_bottom[d]+carry;
if (total > 9) carry = total / 10;
else carry = 0;
result.digits[c] = total % 10;
c--;
}
}
return result;
}
int main( ) {
INT a, b, c;
cout << "Enter two large integers : ";
cin >> a >> b;
cout << "Addition : " << endl;
c = a + b; cout << c << endl;
cout << "Subtraction : " << endl;
c = a - b; cout << c << endl;
cout << "Multiplication : " << endl;
c = a * b; cout << c << endl;
//cout << "Division : " << endl;
//c = a / b; cout << c << endl;
return 0;
}
the subtraction parts, but i am stuck on the multiplication and
division. any suggestions, hints, code, anyhting. it's not a true large
int calculator, the numbers entered are at max 100 intergers.
CODE SO FAR:
#include<iostream> //libraries limited to
#include<string>
using namespace std;
class INT {
int digits[100];
char sign;
public:
INT( ) {
sign = 'p';
for (int a=0; a<100; a++)
digits[a] = 0;
}
INT(int num) {
int a;
for (a=0; a<100; a++) digits[a] = 0;
if (num < 0) { sign = 'n'; num = num * -1; }
else sign = 'p';
a = 99;
while (num > 0) {
digits[a] = num % 10;
num = num / 10;
a = a - 1;
}
}
friend INT operator+(const INT&, const INT&);
friend INT operator-(const INT&, const INT&); // new
friend INT operator*(const INT&, const INT&); // new
friend INT operator/(const INT&, const INT&); // new
friend ostream& operator<<(ostream&, const INT&);
friend istream& operator>>(istream&, INT&);
};
ostream& operator<< (ostream& os, const INT& num) {
int a = 0;
if (num.sign == 'n') os << '-';
while (a < 99 && num.digits[a] == 0)
a++;
while (a < 100)
os << num.digits[a++];
return os;
}
istream& operator>> (istream& is, INT& num) {
string number;
is >> number;
if (number.at(0) == '-') num.sign='n';
if (number.at(0) == '+') num.sign='p';
int start = 0;
if ( !isdigit(number.at(0)) ) start = 1;
int loc = 100-(number.length()-start);
for (int a=start; a<number.length(); a++)
num.digits[loc++] = number.at(a) - '0';
return is;
}
INT operator+(const INT& x, const INT& y) {
INT result, larger, smaller;
if (x.sign == y.sign) {
result.sign = x.sign;
int a, carry = 0, total;
for (a=99; a>=0; a--) {
total=x.digits[a]+y.digits[a]+carry;
if (total > 9) carry = 1;
else carry = 0;
result.digits[a] = total % 10;
}
}
else {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
if (flag) { // add them unless flag is false (the two were equal)
for (int b=99; b>=0; b--) {
if (smaller.digits > larger.digits) { // need to borrow
int c = b-1;
while (larger.digits[c] == 0) {
larger.digits[c] = 9;
c = c - 1;
}
larger.digits[c] = larger.digits[c] - 1;
larger.digits = larger.digits + 10;
}
result.digits = larger.digits - smaller.digits;
}
}
}
return result;
}
INT operator-(const INT& x, const INT& y) {
INT result, larger, smaller;
if (x.sign != y.sign) {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
if(x.digits[a] == y.digits[a]){ result.sign = x.sign; }//my sign
config.
else
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
int carry = 0, total;
for (a=99; a>=0; a--) {
total=x.digits[a]+y.digits[a]+carry;
if (total > 9) carry = 1;
else carry = 0;
result.digits[a] = total % 10;
}
}
else {
int a=0;
bool flag=false;
while (a<100 && flag==false) { // figure out which one is largest
if (x.digits[a] < y.digits[a])
{ larger = y; smaller = x; result.sign = y.sign; flag = true; }
if (x.digits[a] > y.digits[a])
{ larger = x; smaller = y; result.sign = x.sign; flag = true; }
a++;
}
if (flag) { // add them unless flag is false (the two were equal)
for (int b=99; b>=0; b--) {
if (smaller.digits > larger.digits) { // need to borrow
int c = b-1;
while (larger.digits[c] == 0) {
larger.digits[c] = 9;
c = c - 1;
}
larger.digits[c] = larger.digits[c] - 1;
larger.digits = larger.digits + 10;
}
result.digits = larger.digits - smaller.digits;
}
}
}
return result;
}
INT operator*(const INT& x, const INT& y) {
INT result;
int mul_top[100];
int mul_bottom[100];
// int ans[200];
for (int a=99; a>=0; a--)
mul_top[a] = x.digits[a]; //want to copy arrays
for (int a=99; a>=0; a--)
mul_bottom[a] = y.digits[a];
//for (int c=0; c<200; c++) //want 2 find lenghts of #s
// ans[c] = 0; //4 for loops. set e,d = to #s
int c=200, carry=0, total=0; //don't know if .digits or
..ans should b returned
for (int d=99; d>=mul_bottom.lenght(); d--){
for(int e=99; e>=mul_top.lenght(); e--){
total=mul_top[e]*mul_bottom[d]+carry;
if (total > 9) carry = total / 10;
else carry = 0;
result.digits[c] = total % 10;
c--;
}
}
return result;
}
int main( ) {
INT a, b, c;
cout << "Enter two large integers : ";
cin >> a >> b;
cout << "Addition : " << endl;
c = a + b; cout << c << endl;
cout << "Subtraction : " << endl;
c = a - b; cout << c << endl;
cout << "Multiplication : " << endl;
c = a * b; cout << c << endl;
//cout << "Division : " << endl;
//c = a / b; cout << c << endl;
return 0;
}