Last active
June 21, 2020 10:17
-
-
Save shanenoi/90c979008449638f2e2803a5bd27589a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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