Created
December 15, 2017 14:00
-
-
Save Pipeliner/de793f5583d494a15fcf8bbcdaa30da0 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 <iostream> | |
struct longNumber { | |
int length; | |
unsigned char *digits; | |
}; | |
longNumber multiplyBySingleDigit(longNumber a, unsigned char b) | |
{ | |
longNumber result; | |
result.length = a.length + 1; | |
result.digits = new unsigned char[result.length]; | |
unsigned char carry = 0; | |
for (int i =a.length - 1; i>=0; i--) {// loop over digits | |
int aDigit =(int)a.digits[i]; | |
int bDigit = (int)b;// step 1. multiply current digit by b | |
int Mult=aDigit*bDigit; | |
// step 2. add carry | |
Mult =Mult+carry; | |
// step 3. split result to current digit and new carry | |
result.digits[i+1]=Mult%256; | |
carry=Mult/256; | |
// step 4. write out current digit | |
} | |
//write out carry | |
result.digits[0]=carry; | |
return result; | |
} | |
longNumber extend(longNumber a, int extendToDigits) | |
{ | |
int extendBy = extendToDigits - a.length; | |
longNumber result; | |
result.length=extendToDigits; | |
result.digits = new unsigned char[result.length]; | |
for ( int i=0; i<a.length; i++){ | |
result.digits[i+extendBy]=a.digits[i]; | |
} | |
return result; | |
} | |
longNumber shift(longNumber a, int shiftLeft) | |
{ | |
} | |
longNumber extendAndShift(longNumber a, int extendToDigits, int shiftLeft) | |
{ | |
} | |
longNumber addLongNumbers(longNumber numbers[]) | |
{ | |
} | |
longNumber multiply(longNumber a, longNumber b) { | |
longNumber result; | |
result.length = a.length + b.length; | |
result.digits = new unsigned char[result.length]; | |
return result; | |
} | |
void printLongNumber(longNumber a) { | |
for (int i = 0; i < a.length; i++) | |
std::cout << (int)a.digits[i] << " "; | |
std::cout << std::endl; | |
} | |
void checkMultiplicationByDigit(longNumber a, unsigned char b, longNumber expectedResult) { | |
longNumber actualResult = multiplyBySingleDigit(a, b); | |
if (actualResult.length != expectedResult.length) { | |
std::cout << "Wrong multiplication result: length mismatch" << std::endl; | |
return; | |
} | |
for (int i = 0; i < actualResult.length; i++) { | |
if (actualResult.digits[i] != expectedResult.digits[i]) { | |
std::cout << "Wrong multiplication result: digit mismatch" << std::endl; | |
return; | |
} | |
} | |
std::cout << "Correct multiplication result" << std::endl; | |
} | |
void checkMultiplication(longNumber a, longNumber b, longNumber expectedResult) { | |
longNumber actualResult = multiply(a, b); | |
if (actualResult.length != expectedResult.length) { | |
std::cout << "Wrong multiplication result: length mismatch" << std::endl; | |
return; | |
} | |
for (int i = 0; i < actualResult.length; i++) { | |
if (actualResult.digits[i] != expectedResult.digits[i]) { | |
std::cout << "Wrong multiplication result: digit mismatch" << std::endl; | |
return; | |
} | |
} | |
std::cout << "Correct multiplication result" << std::endl; | |
} | |
int main() { | |
longNumber one; | |
one.length = 1; | |
one.digits = new unsigned char[one.length]; | |
one.digits[0] = 1; | |
longNumber one2byte; // = {2, {0, 1}}; | |
one2byte.length = 2; | |
one2byte.digits = new unsigned char[one2byte.length]; | |
one2byte.digits[0] = 0; | |
one2byte.digits[1] = 1; | |
longNumber twenty; | |
twenty.length = 1; | |
twenty.digits = new unsigned char[twenty.length]; | |
twenty.digits[0] = 20; | |
longNumber fourHundred; | |
fourHundred.length = 2; | |
fourHundred.digits = new unsigned char[fourHundred.length]; | |
fourHundred.digits[0] = 1; | |
fourHundred.digits[1] = 144; | |
checkMultiplicationByDigit(one, 1, one2byte); | |
checkMultiplicationByDigit(twenty, 20, fourHundred); | |
printLongNumber(fourHundred); | |
printLongNumber(extend(fourHundred, 6)); | |
//printLongNumber(one2byte); | |
//printLongNumber(multiplyBySingleDigit(one, 1)); | |
//checkMultiplication(one, one, one2byte); // one * one == one2byte | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment