Skip to content

Instantly share code, notes, and snippets.

@shanenoi
Last active June 21, 2020 10:17
Show Gist options
  • Save shanenoi/90c979008449638f2e2803a5bd27589a to your computer and use it in GitHub Desktop.
Save shanenoi/90c979008449638f2e2803a5bd27589a to your computer and use it in GitHub Desktop.
#include <cmath>
#include <string.h>
#include <iostream>
using namespace std;
class Integer {
public:
char* value[2] = { strdup("0"), strdup("+") };
void init(int);
void init(long);
void init(char*);
Integer operator+(Integer &integer_number) {
Integer result;
char opt[3];
opt[0] = *(this->value[1]);
opt[1] = *strdup("+");
opt[2] = *(integer_number.value[1]);
cout << this->value << " " << integer_number.value << endl;
char* cc = this->parse_operator(opt);
char temp[2] = {cc[0], '\0'};
result.value[1] = temp;
if (*(cc+2)=='1') {
if (*(cc+3)=='+') {
result.value[0] = this->addBigNumber(this->value[0], integer_number.value[0]);
} else if (*(cc+3)=='-') {
result.value[0] = this->subBigNumber(this->value[0], integer_number.value[0]);
}
} else if (*(cc+2)=='2'){
if (*(cc+3)=='+') {
result.value[0] = this->addBigNumber(integer_number.value[0], this->value[0]);
} else if (*(cc+3)=='-') {
result.value[0] = this->subBigNumber(integer_number.value[0], this->value[0]);
}
}
return result;
}
Integer operator-(Integer&);
//private:
char* slice(char*, unsigned, unsigned, unsigned);
char* parse_operator(char*);
void swapPointer(char**, char**);
char* addBigNumber(char*, char*);
char* subBigNumber(char*, char*);
};
void Integer::init(int number) {
int len_number = (int)log10(abs(number))+1;
static char * result = (char*)(malloc(len_number));
*(this->value+1) = (number>0)? strdup("+"):strdup("-");
number = abs(number);
while (number) {
result[--len_number] = (char)(number%10+48);
number /= 10;
}
*(this->value) = result;
}
void Integer::init(long number) {
int len_number = (int)log10(abs(number))+1;
static char * result = (char*)(malloc(len_number));
*(this->value+1) = (number>0)? strdup("+"):strdup("-");
number = abs(number);
while (number) {
result[--len_number] = (char)(number%10+48);
number /= 10;
}
*(this->value) = result;
}
void Integer::init(char* number) {
char first_char = *(number);
if (first_char=='+') {
*(this->value+1) = strdup("+");
} else if (first_char=='-') {
*(this->value+1) = strdup("-");
}
*(this->value) = this->slice(number, 1, strlen(number), 1);
}
char* Integer::slice( char* sample, unsigned start, unsigned end, unsigned step ) {
static char* result = (char*)malloc( (int)(end-start)/step );
int result_index=0;
for(unsigned sample_index=start; sample_index<end; sample_index+=step) {
*(result+(result_index++)) = *(sample+sample_index);
}
return result;
}
char* Integer::parse_operator(char* opt) {
/*
+ + +
+ + -
+ - +
+ - -
- + +
- + -
- - +
- - -
this function will return order of operations
* archecture:
sign|FirstOperatorSecond
*/
if (strcmp(opt, "+++")==0) return strdup("+|1+2");
else if(strcmp(opt, "++-")==0) return strdup("+|1-2");
else if(strcmp(opt, "+-+")==0) return strdup("+|1-2");
else if(strcmp(opt, "+--")==0) return strdup("+|1+2");
else if(strcmp(opt, "-++")==0) return strdup("+|2-1");
else if(strcmp(opt, "-+-")==0) return strdup("-|1+2");
else if(strcmp(opt, "--+")==0) return strdup("-|1+2");
else if(strcmp(opt, "---")==0) return strdup("+|2-1");
}
void Integer::swapPointer(char** variable1, char** variable2) {
char* temp = *variable1;
*variable1 = *variable2;
*variable2 = temp;
}
char* Integer::addBigNumber(char* number1, char* number2) {
if (strlen(number1) < strlen(number2)) {
this->swapPointer(&number1, &number1);
}
size_t number1_length = strlen(number1), number2_length = strlen(number2);
char* result = new char[number1_length + 2];
memset(result, '0', number1_length);
bool remember = false;
for (int i = 0; i < number2_length; i++) {
int temp = *(number2 + number2_length - i - 1) - '0' + *(number1 + number1_length - i - 1) - '0';
if (remember)
temp++;
if (temp > 9)
remember = true;
else
remember = false;
temp = temp % 10;
*(result + number1_length - i) = temp + '0';
}
for (int i = 0; i < number1_length - number2_length; i++) {
int temp = *(number1 + number1_length - number2_length - i - 1) - '0';
if (remember)
temp++;
if (temp > 9)
remember = true;
else
remember = false;
temp = temp % 10;
*(result + number1_length - number2_length - i) = temp + '0';
}
*(result + number1_length + 1) = '\0';
if (remember) {
*(result) = '1';
}
else {
for (int i = 0; i <= number1_length; i++)
*(result + i) = *(result + i + 1);
}
return result;
}
char* Integer::subBigNumber(char* number1, char* number2) {
bool sign = false, remember = false;
if (strlen(number1) < strlen(number2)) {
sign = true;
swapPointer(&number1, &number2);
}
else if (strlen(number1) == strlen(number2)) {
for (int i = strlen(number1) - 1; i >= 0; i--) {
if (*(number1 + i) < *(number2 + i)) {
swapPointer(&number1, &number2);
sign = true;
}
}
}
size_t number1_length = strlen(number1);
size_t number2_length = strlen(number2);
char* result = new char [number1_length + 2];
memset(result, '0', number1_length + 2);
for (int i = 0; i < number2_length; i++) {
int temp = *(number1 + number1_length - i - 1) - *(number2 + number2_length - i - 1);
if (remember)
temp--;
if (temp < 0) {
temp += 10;
remember = true;
}
else
remember = false;
*(result + number1_length - i) = temp + '0';
}
for (int i = 0; i < number1_length - number2_length; i++) {
int temp = *(number1 + number1_length - number2_length - i - 1) - '0';
if (remember == true)
temp--;
if (temp < 0) {
temp += 10;
remember = true;
}
else
remember = false;
*(result + number1_length - number2_length - i) = temp + '0';
}
while (*(result) == '0') {
if (*(result + 1) != '0' && sign == true) {
*(result) = '-';
*(result + number1_length + 1) = '\0';
break;
}
for (int i = 0; i < number1_length; i++) {
*(result + i) = *(result + i + 1);
}
*(result + number1_length) = '\0';
}
return result;
}
3. Xây dựng một lớp số nguyên lớn (có kich thước tổi đa đến 1000 chữ số). Hãy xác định các thuộc tính thích hợp. Ngoài ra, hãy xây dựng các hàm thành viên sau:
a. Các hàm tạo :
i Hàm không tham số tạo ra giá trị 0;
ii. Hàm tạo một số nguyên tử một số nguyên (tham số có thể là kiểu nt hoặc long);
iii. Hàm tạo số nguyên từ một hàng chuỗi các chữ số và dầu để biểu diễn số nguyên, hàm copy (nếu cân)
b. Các toàn tử : =, <<, +, -, 1, %,.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment