Guest User

Untitled

a guest
Dec 18th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include<iostream>
  2. #include<list>
  3. #include<stdlib.h>
  4. #include<gmpxx.h>
  5. #include<string>
  6. #include<sstream>
  7.  
  8. using namespace std;
  9.  
  10. string calculate(mpz_class sum, int num, int d) {  
  11.     //zmienne:
  12.     //ss sluzy do przekazania wyniku w postaci inta do
  13.     //result ktory przechowa ostateczny wynik
  14.     stringstream ss;
  15.     string result = "";
  16.  
  17.     //przechodzimy do dzielenia ulamkowego czyli zwiekszamy reszte o 10 (przechodzimy w prawo)
  18.     ss << sum / num;
  19.     ss << ".";
  20.     mpz_class rest = sum % num * 10;   
  21.  
  22.     //wykonujemy iteracje do d miejsc po przecinku
  23.     //jesli reszta mniejsza od dzielnikia to idziemy o 1 w prawo
  24.     //i dodajemy do wyniku tymczasowego 0, jesli reszta == dzielnik
  25.     //to nie ma sensu dalej liczyc gdyz nie bedzie reszty z dzielenia
  26.     for(int i=0; i<d; i++) {
  27.         if(rest < num) {
  28.             ss << 0;
  29.             rest *= 10;
  30.             continue;
  31.         }      
  32.         else if(rest == num) {
  33.             ss << 0;
  34.             break;
  35.         }
  36.         else {
  37.             ss << rest / num;
  38.             rest = rest % num * 10;
  39.             continue;
  40.         }
  41.     }
  42.    
  43.     //dodajemy wynik dzielenia do stringa
  44.     result.append(ss.str());
  45.    
  46.     return result;
  47. }
  48.  
  49. string power(string tempResult, int d) {
  50.     string result = "", resTemp = "";
  51.     stringstream ss;
  52.     int i, dot, dotOff;
  53.  
  54.     for(i=0; i<tempResult.size(); i++)
  55.         if(tempResult[i] == '.')
  56.             break;
  57.    
  58.     dotOff = tempResult.size()-i;
  59.     resTemp.append(tempResult,0,i);
  60.     resTemp.append(tempResult,i+1,dotOff);
  61.  
  62.     dotOff -= 1;
  63.     dotOff *= 2;
  64.  
  65.     mpz_class res(resTemp);
  66.  
  67.     res *= res;
  68.     ss << res;
  69.     resTemp = "";
  70.     resTemp.append(ss.str());
  71.  
  72.     result.append(resTemp,0,resTemp.size()-dotOff);
  73.     result.append(".");
  74.     result.append(resTemp,resTemp.size()-dotOff,d);
  75.  
  76.     //cout << result << endl;
  77.     return result;
  78. }
  79.  
  80. string sub(string result2, string result2_2, int d) {
  81.     string r1 = "", r2 = "", d1 = "1";
  82.     stringstream ss;   
  83.    
  84.     for(int i=0; i<d; i++)
  85.         d1.append("0");
  86.  
  87.     r1.append(result2,0,result2.size()-d-1);
  88.     r1.append(result2,result2.size()-d,result2.size());
  89.     r2.append(result2_2,0,result2_2.size()-d-1);
  90.     r2.append(result2_2,result2_2.size()-d,result2_2.size());
  91.  
  92.     mpz_class res1(r1), res2(r2), div(d1);
  93.     res1 -= res2;  
  94.     result2 = "";
  95.  
  96.     ss << res1 / div << "." << res1 % div;
  97.     result2.append(ss.str());
  98.        
  99.     return result2;
  100. }
  101.  
  102. string delZero(string result) {
  103.     string temp = result;
  104.     int zero = 0;
  105.     //cout << "temp: " << temp << endl;
  106.     for(string::iterator iter = temp.end()-1; iter != temp.begin(); iter--) {
  107.         if(*iter == '0')
  108.             zero++;
  109.         else if(*iter == '.') {
  110.             zero++;
  111.             break;
  112.         }
  113.         else
  114.             break;
  115.     }
  116.    
  117.     //cout << zero << endl;
  118.  
  119.     result = "";
  120.     result.append(temp,0,temp.size()-zero);
  121.     //cout << result << endl;
  122.     return result;
  123. }
  124.  
  125. int main(int argc, char* argv[]) {
  126.  
  127.     ios::sync_with_stdio(false);   
  128.     int d = atoi(argv[1]);
  129.     string result1, result2, result2_2;
  130.  
  131.     list<mpz_class> classlist;
  132.     mpz_class sum1 = 0, sum2 = 0, prec;
  133.     mpz_t prec2;
  134.     mpz_init(prec2);
  135.     while(gmp_scanf("%Zd",prec2) != EOF) {
  136.         prec = mpz_class(prec2);
  137.         classlist.push_back(prec);
  138.         sum1 += prec;
  139.         sum2 += prec * prec;
  140.     }
  141.    
  142.     /*for(list<mpz_class>::iterator iter = classlist.begin(); iter != classlist.end(); ++iter) {
  143.        
  144.     }*/
  145.  
  146.     result1 = calculate(sum1, classlist.size(), d);
  147.     result2 = calculate(sum2, classlist.size(), d);
  148.     result2_2 = power(result1,d);
  149.     result2 = sub(result2,result2_2,d);
  150.    
  151.     cout << "1: " << delZero(result1) << endl << "2: " << delZero(result2) << endl;
  152.     return 0;
  153. }
Add Comment
Please, Sign In to add comment