Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<list>
- #include<stdlib.h>
- #include<gmpxx.h>
- #include<string>
- #include<sstream>
- using namespace std;
- string calculate(mpz_class sum, int num, int d) {
- //zmienne:
- //ss sluzy do przekazania wyniku w postaci inta do
- //result ktory przechowa ostateczny wynik
- stringstream ss;
- string result = "";
- //przechodzimy do dzielenia ulamkowego czyli zwiekszamy reszte o 10 (przechodzimy w prawo)
- ss << sum / num;
- ss << ".";
- mpz_class rest = sum % num * 10;
- //wykonujemy iteracje do d miejsc po przecinku
- //jesli reszta mniejsza od dzielnikia to idziemy o 1 w prawo
- //i dodajemy do wyniku tymczasowego 0, jesli reszta == dzielnik
- //to nie ma sensu dalej liczyc gdyz nie bedzie reszty z dzielenia
- for(int i=0; i<d; i++) {
- if(rest < num) {
- ss << 0;
- rest *= 10;
- continue;
- }
- else if(rest == num) {
- ss << 0;
- break;
- }
- else {
- ss << rest / num;
- rest = rest % num * 10;
- continue;
- }
- }
- //dodajemy wynik dzielenia do stringa
- result.append(ss.str());
- return result;
- }
- string power(string tempResult, int d) {
- string result = "", resTemp = "";
- stringstream ss;
- int i, dot, dotOff;
- for(i=0; i<tempResult.size(); i++)
- if(tempResult[i] == '.')
- break;
- dotOff = tempResult.size()-i;
- resTemp.append(tempResult,0,i);
- resTemp.append(tempResult,i+1,dotOff);
- dotOff -= 1;
- dotOff *= 2;
- mpz_class res(resTemp);
- res *= res;
- ss << res;
- resTemp = "";
- resTemp.append(ss.str());
- result.append(resTemp,0,resTemp.size()-dotOff);
- result.append(".");
- result.append(resTemp,resTemp.size()-dotOff,d);
- //cout << result << endl;
- return result;
- }
- string sub(string result2, string result2_2, int d) {
- string r1 = "", r2 = "", d1 = "1";
- stringstream ss;
- for(int i=0; i<d; i++)
- d1.append("0");
- r1.append(result2,0,result2.size()-d-1);
- r1.append(result2,result2.size()-d,result2.size());
- r2.append(result2_2,0,result2_2.size()-d-1);
- r2.append(result2_2,result2_2.size()-d,result2_2.size());
- mpz_class res1(r1), res2(r2), div(d1);
- res1 -= res2;
- result2 = "";
- ss << res1 / div << "." << res1 % div;
- result2.append(ss.str());
- return result2;
- }
- string delZero(string result) {
- string temp = result;
- int zero = 0;
- //cout << "temp: " << temp << endl;
- for(string::iterator iter = temp.end()-1; iter != temp.begin(); iter--) {
- if(*iter == '0')
- zero++;
- else if(*iter == '.') {
- zero++;
- break;
- }
- else
- break;
- }
- //cout << zero << endl;
- result = "";
- result.append(temp,0,temp.size()-zero);
- //cout << result << endl;
- return result;
- }
- int main(int argc, char* argv[]) {
- ios::sync_with_stdio(false);
- int d = atoi(argv[1]);
- string result1, result2, result2_2;
- list<mpz_class> classlist;
- mpz_class sum1 = 0, sum2 = 0, prec;
- mpz_t prec2;
- mpz_init(prec2);
- while(gmp_scanf("%Zd",prec2) != EOF) {
- prec = mpz_class(prec2);
- classlist.push_back(prec);
- sum1 += prec;
- sum2 += prec * prec;
- }
- /*for(list<mpz_class>::iterator iter = classlist.begin(); iter != classlist.end(); ++iter) {
- }*/
- result1 = calculate(sum1, classlist.size(), d);
- result2 = calculate(sum2, classlist.size(), d);
- result2_2 = power(result1,d);
- result2 = sub(result2,result2_2,d);
- cout << "1: " << delZero(result1) << endl << "2: " << delZero(result2) << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment