mawinkle 6 anni fa
parent
commit
2eb695afa6
2 ha cambiato i file con 31 aggiunte e 5 eliminazioni
  1. 29 4
      BigInt.hpp
  2. 2 1
      test.cpp

+ 29 - 4
BigInt.hpp

@@ -42,7 +42,7 @@ struct BigInt{
 		data[0] = u(std::abs(n));
 		signum = ::signum(n);
 	}
-	inline uint32_t mod(uint32_t o){
+	inline uint64_t mod(uint64_t o){
 		uint64_t carry = 0;
 		for(size_t i = 0;i < data.size();i++){
 			carry = ((carry << 32) + data[i]) % o;
@@ -71,12 +71,16 @@ struct BigInt{
 		}
 		return ret;
 	}
-	
+	void trim(){
+		while(!(data[1] | data[0]))data.pop_front();
+	}
 	inline BigInt mult(const BigInt& other){
 		std::deque<std::deque<uint64_t>> matrix(size(), std::deque<uint64_t>(other.size() + 1, 0));
 		uint64_t carry = 0;
+		
 		BigInt ret(size() + other.size(), false);
 		for(size_t i = 0;i < size();i++){
+			carry = 0;
 			for(size_t ih = 0;ih < other.size();ih++){
 				uint64_t res = data[size() - i - 1] * other.data[other.size() - ih - 1];
 				res += carry;
@@ -85,6 +89,13 @@ struct BigInt{
 			}
 		}
 		carry = 0;
+		if(false)
+		for(size_t i = 0;i < matrix.size();i++){
+			for(size_t ih = 0;ih < matrix.size();ih++){
+				std::cout << matrix[i][ih] << " ";
+			}
+			std::cout << std::endl;
+		}
 		for(size_t column = 0;column < (matrix.size() + other.size());column++){
 			uint64_t accum = 0;
 			for(size_t row = 0;row < matrix.size();row++){
@@ -98,16 +109,30 @@ struct BigInt{
 			carry = u(accum);
 			ret.data[ret.size() - column - 1] = l(accum);
 		}
-		if(ret.data[0] == 0)ret.data.pop_front();
+		ret.trim();
+		//if(ret.data[0] == 0)ret.data.pop_front();
 		return ret;
 	}
 	inline size_t size()const{
 		return data.size();
 	}
+	inline bool isZero(){
+		for(uint64_t d : data){
+			if(d)return false;
+		}
+		return true;
+	}
+	inline std::string rawString(){
+		std::string a = "";
+		for(uint64_t d : data){
+			a += (std::to_string(d) + "|");
+		}
+		return a;
+	}
 	inline std::string toString(){
 		std::string a = "";
 		BigInt dec(*this);
-		while(dec.data[dec.data.size() - 1]){
+		while(!dec.isZero()){
 			a = std::to_string(dec.mod(10)) + a;
 			dec = dec.div(10);
 		}

+ 2 - 1
test.cpp

@@ -21,7 +21,8 @@ std::ostream& operator<< <char>(std::ostream& out, std::vector<char> o){
 	return out;
 }
 int main(){
-	BigInt a(2ULL);
+	BigInt a(234534ULL);
+	a = a.mult(a);
 	a = a.mult(a);
 	a = a.mult(a);
 	a = a.mult(a);