Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <bitset>
- #include <string.h>
- #include <string>
- #include <sstream>
- #include <algorithm>
- #include <vector>
- #include <ostream>
- #include <iterator>
- struct smNum
- {
- bool sign;
- std::vector <unsigned int > module_val;
- smNum(){
- sign = false;
- module_val = module_val;
- }
- std::string toString_decimal(){
- std::stringstream ss;
- copy( module_val.begin(), module_val.end(), std::ostream_iterator<unsigned int>(ss, " "));
- std::string value = ss.str();
- if(sign==0){
- std::string str("+ ");
- return str + value;
- }
- else{
- std::string str("- ");
- return str + value;
- }
- }
- };
- bool isBigger(smNum x, smNum y){
- if (x.module_val.size() > y.module_val.size()){
- return true;
- } else {
- if(x.module_val[0] > y.module_val[0])
- return true;
- }
- return false;
- }
- smNum add(smNum x, smNum y){
- smNum s;
- bool overflow = false;
- int xSize = x.module_val.size();
- int ySize = y.module_val.size();
- int e=0;
- if(xSize > ySize)
- e = x.module_val.size();
- else e = y.module_val.size();
- if(x.sign == y.sign){ //znaki zgodne
- s.sign = x.sign;
- //dodawanie modulow
- for(int i = 1; i <= e ; i++) {
- if (overflow == false) {
- s.module_val.insert(s.module_val.begin(), x.module_val[xSize -i]+ y.module_val[ySize-i]);
- if (s.module_val[0] < x.module_val[xSize-i] || s.module_val[0] < y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- } else {
- s.module_val.insert(s.module_val.begin(), x.module_val[xSize-i]+ y.module_val[ySize-i] + 1);
- if (s.module_val[0] < x.module_val[xSize - i] || s.module_val[0] < y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- }
- }
- if (overflow == true)
- s.module_val.insert(s.module_val.begin(), 1);
- }
- else{ //znaki niezgodne
- if(isBigger(x,y)){
- s.sign = x.sign;
- for(int i = 1; i <= e ; i++) {
- if (overflow == false) {
- s.module_val.insert(s.module_val.begin(), x.module_val[xSize -i]- y.module_val[ySize-i]);
- if ( x.module_val[xSize-i] < y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- } else {
- s.module_val.insert(s.module_val.begin(), x.module_val[xSize-i]- y.module_val[ySize-i] - 1);
- if (x.module_val[xSize-i] < y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- }
- }
- if (overflow == true)
- s.module_val.insert(s.module_val.begin(), 1);
- }
- else
- {
- for(int i = 1; i <= e ; i++) {
- if (overflow == false) {
- s.module_val.insert(s.module_val.begin(), y.module_val[ySize -i]- x.module_val[xSize-i]);
- if (x.module_val[xSize-i] > y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- } else {
- s.module_val.insert(s.module_val.begin(), y.module_val[ySize-i]- x.module_val[xSize-i] - 1);
- if (x.module_val[xSize-i] > y.module_val[ySize-i] )
- overflow = true; else overflow = false;
- }
- }
- if (overflow == true)
- s.module_val.insert(s.module_val.begin(), 1);
- }
- }
- return s;
- }
- int main()
- {
- smNum m1;
- m1.sign = 1;
- m1.module_val.push_back(222);
- m1.module_val.push_back(4294967295);
- m1.module_val.push_back(234);
- smNum m2;
- m2. sign = 1;
- m2.module_val.push_back(11);
- m2.module_val.push_back(22);
- smNum s1;
- s1 = add (m1, m2);
- std::cout<<m1.toString_decimal()<<std::endl;
- std::cout<<m2.toString_decimal()<<std::endl;
- std::cout<<s1.toString_decimal()<<std::endl;
- std::cout<<"ROZNE ZNAKI"<<std::endl;
- smNum m3;
- m3.sign = 1;
- m3.module_val.push_back(222);
- m3.module_val.push_back(4294967295);
- m3.module_val.push_back(234);
- smNum m4;
- m4. sign = 0;
- m4.module_val.push_back(1111);
- m4.module_val.push_back(235);
- smNum s2;
- s2 = add (m3,m4);
- std::cout<<m3.toString_decimal()<<std::endl;
- std::cout<<m4.toString_decimal()<<std::endl;
- std::cout<<s2.toString_decimal()<<std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement