a53

RADICAL_COMENT_VERS_NOUA__NR_MARI_PROP

a53
Feb 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.15 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. ifstream in("text.in");
  5. ofstream out("text.out");
  6.  
  7. bool mic(string str1,string str2) // compar dacă e mai mic strict str1 ca str 2
  8. {
  9. int n1=str1.length(),n2=str2.length();
  10. if(n1<n2)
  11. return true;
  12. if(n1>n2)
  13. return false;
  14. for(int i=0;i<n1;i++)
  15. {
  16. if(str1[i]<str2[i])
  17. return true;
  18. else
  19. if(str1[i]>str2[i])
  20. return false;
  21. }
  22. return true;
  23. }
  24. string sx(string str1,string str2) // sumă numere mari adaptat pentru numere zecimale
  25. {
  26. int ls=0,lss=0,o1=0,o2=0,lmax,len;
  27. if(str1.find('.')!=-1)
  28. ls=str1.find('.'),o1=1;
  29. if(str2.find('.')!=-1)
  30. lss=str2.find('.'),o2=1;
  31. lmax=max(ls,lss);
  32. len=max(str1.size(),str2.size()); // parte comuna in majoritatea algormilor, scap de virgula le calculez normal si pun virgula la sfârșit difera de la produs suma sau diferentă , sumă ramane poziția constanta
  33. if(o1)
  34. {
  35. str1.erase(str1.begin()+ls),ls--;
  36. ls=str1.size()-1-ls;
  37. }
  38. if(o2)
  39. {
  40. str2.erase(str2.begin()+lss),lss--;
  41. lss=str2.size()-1-lss;
  42. }
  43. len=max(str1.size(),str2.size());
  44. if(ls>lss)
  45. for(int i=1;i<=ls-lss;i++)
  46. str2+='0';
  47. else
  48. if(lss>ls)
  49. for(int i=1;i<=lss-ls;i++)
  50. str1+='0';
  51. int t=0;
  52. if (str1.length()>str2.length())
  53. swap(str1,str2);
  54. string str="";
  55. int n1=str1.length(),n2=str2.length();
  56. int dif=n2-n1;
  57. for(int i=n1-1;i>=0;i--)
  58. {
  59. int sum=((str1[i]-'0')+(str2[i+dif]-'0')+t);
  60. str.push_back(sum%10+'0');
  61. t=sum/10;
  62. }
  63. for(int i=n2-n1-1;i>=0;i--)
  64. {
  65. int sum=((str2[i]-'0')+t);
  66. str.push_back(sum%10+'0');
  67. t=sum/10;
  68. }
  69. if(t)
  70. str.push_back(t+'0');
  71. reverse(str.begin(),str.end());
  72. if(ls || lss)
  73. str.insert(str.begin()+lmax+(str.size()-len),'.'); // pun virgula
  74. return str;
  75. }
  76. string px(string num1, string num2) // produs numere mari adaptat pentru zecimale
  77. {
  78. int ls=0,lss=0,o1=0,o2=0,ls1=0,ls2=0,lmax;
  79. if(num1.find('.')!=-1)
  80. ls=num1.find('.'),o1=1,ls1=ls;
  81. if(num2.find('.')!=-1)
  82. lss=num2.find('.'),o2=1,ls2=lss;
  83. if(o1)
  84. ls1=num1.size()-1-ls1;
  85. if(o2)
  86. ls2=num2.size()-1-ls2;
  87. lmax=ls1+ls2;
  88. if(o1)
  89. {
  90. num1.erase(num1.begin()+ls),ls--; // numărul zecimalelor este dat de suma nr zecimale din ambele numere
  91. ls=num1.size()-1-ls;
  92. }
  93. if(o2)
  94. {
  95. num2.erase(num2.begin()+lss),lss--;
  96. lss=num2.size()-1-lss;
  97. }
  98. if(ls>lss)
  99. for(int i=1;i<=ls-lss;i++)
  100. num2+='0';
  101. else
  102. if(lss>ls)
  103. for(int i=1;i<=lss-ls;i++)
  104. num1+='0';
  105. int n1=num1.size();
  106. int n2=num2.size();
  107. if(n1==0||n2==0)
  108. return "0";
  109. vector<int> rez(n1+n2,0);
  110. int i_n1=0;
  111. int i_n2=0;
  112. for(int i=n1-1;i>=0;i--)
  113. {
  114. int t=0;
  115. int n1=num1[i]-'0';
  116. i_n2=0;
  117. for(int j=n2-1;j>=0;j--)
  118. {
  119. int n2=num2[j]-'0';
  120. int sum=n1*n2+rez[i_n1+i_n2]+t;
  121. t=sum/10;
  122. rez[i_n1+i_n2]=sum%10;
  123. i_n2++;
  124. }
  125. if(t>0)
  126. rez[i_n1+i_n2]+=t;
  127. i_n1++;
  128. }
  129. int i=rez.size()-1;
  130. while(i>=0 && rez[i]==0)
  131. i--;
  132. if(i==-1)
  133. return "0";
  134. string s="";
  135. while(i>=0)
  136. s+=to_string(rez[i--]);
  137. if(ls1 || ls2)
  138. s.insert(s.begin()+(s.size()-1-lmax),'.'); // virgula
  139. return s;
  140. }
  141.  
  142. string dx(string str1,string str2) // diferentă nr mari
  143. {
  144. int ls=0,lss=0,o1=0,o2=0,lmax,len;
  145. if(str1.find('.')!=-1)
  146. ls=str1.find('.'),o1=1;
  147. if(str2.find('.')!=-1)
  148. lss=str2.find('.'),o2=1;
  149. lmax=max(ls,lss);
  150. len=max(str1.size(),str2.size());
  151. if(o1)
  152. {
  153. str1.erase(str1.begin()+ls),ls--;
  154. ls=str1.size()-1-ls;
  155. }
  156. if(o2)
  157. {
  158. str2.erase(str2.begin()+lss),lss--;
  159. lss=str2.size()-1-lss;
  160. }
  161. len=max(str1.size(),str2.size()); // calculez unde pun virgula
  162. if(ls>lss)
  163. for(int i=1;i<=ls-lss;i++)
  164. str2+='0';
  165. else
  166. if(lss>ls)
  167. for(int i=1;i<=lss-ls;i++)
  168. str1+='0';
  169. if(mic(str1,str2))
  170. swap(str1,str2);
  171. string str = "";
  172. if(str1[0]=='0')
  173. return "0";
  174. int n1=str1.length(),n2=str2.length();
  175. int dif=n1-n2;
  176. int t=0;
  177. for(int i=n2-1;i>=0;i--)
  178. {
  179. int sub=((str1[i+dif]-'0')-(str2[i]-'0')-t);
  180. if(sub<0)
  181. sub+=10,t=1;
  182. else
  183. t=0;
  184. str.push_back(sub+'0');
  185. }
  186. for(int i=n1-n2-1;i>=0;i--)
  187. {
  188. if(str1[i]=='0'&&t)
  189. {
  190. str.push_back('9');
  191. continue;
  192. }
  193. int sub=((str1[i]-'0')-t);
  194. if (i>0||sub>0)
  195. str.push_back(sub+'0');
  196. t=0;
  197. }
  198. reverse(str.begin(),str.end());
  199. if(ls || lss)
  200. str.insert(str.begin()+lmax+(str.size()-len),'.'); // pun virgula
  201. return str;
  202. }
  203. string srx(string s) // sqrt numar mare
  204. {
  205. string rez,temp,aux,p;
  206. int ok=0,k,o=0,c=0,l;
  207. if(s[0]=='-') // daca e cu minus, ok=1 il sterg si il pun la final ca i.
  208. ok=1,s.erase(s.begin()+0);
  209. if(s.find('.')==-1) // daca e "integer"
  210. {
  211. l=s.size(); // se grupează câte 2 cifre asa că se calulează pentru nr impare si pare, impar e +1 pentru că e cel neinclus pentru că se, insa l se pastrează constant pentru de cifre .
  212. if(s.size()%2) // determinarea cazului cu nr impar sau par de cifre
  213. k=s.size()/2+1;
  214. else
  215. k=s.size()/2;
  216. }
  217. else
  218. {
  219. k=s.find('.'),s.erase(s.begin()+k); // dacă exista virgula o sterg și repet procedeul de mai sus.
  220. l=k;
  221. if(k%2)
  222. k=k/2+1;
  223. else
  224. k/=2;
  225. }
  226. s+="0000000000000000"; // adaug 16 zerouri considerand că numărul are putine cifre, vom sterge zecimalele in plus la final.
  227. if(l%2) // daca e numar de cifre impar
  228. {
  229. o=1; // o va reprezenta de unde vom itera cand mergem la general , daca intram aici continuam de la 1
  230. temp+=s[0]; // luam prima cifră caz particular
  231. while(c<9) // acest algoritm se repeat cu mici schimbari si mai jos, aici cautam un număr la patrat , iesim din while cand gasim numar mai mare decat temp, caz particular pentru 9.
  232. {
  233. aux+=to_string(c++); // care il vom detalia mai jos.
  234. p=px(aux,aux);
  235. if(!mic(p,temp))
  236. break;
  237. aux.pop_back(); // punem cifra scoatem cifra cat e mai mic produsul lor.
  238. }
  239. rez+=--aux[0]; // rezultatul va fi ultima cifra -1, in cazul de fata cifra ultima e chiar prima cifră din aux,
  240. p=dx(temp,px(aux,aux)); // calculam dacă exista rest.
  241. while(p[0]=='0') // scoatem zerourile din rest
  242. p.erase(p.begin()+0);
  243. if(p!="") // dacă e rest il punem in temp
  244. temp=p;
  245. else
  246. temp="";
  247. }
  248. for(int i=o;i<s.size();) // cazul general
  249. {
  250. c=-1;
  251. temp+=s[i++]; // luam cate 2 cifre
  252. temp+=s[i++];
  253. if(temp=="00") // daca e 00 nu are sens să continuam am pierde timpul
  254. {
  255. rez+='0';
  256. temp="";
  257. continue;
  258. }
  259. if(aux!="") // numărul a avut nr impar de cifre dublăm altfel facem cazul particular pentru primele cifre.
  260. aux=px(rez,"2");
  261. else
  262. {
  263. while(c<9)
  264. {
  265. c++;
  266. if(c==10)
  267. {
  268. aux+=to_string(--c); // iesim la peste tot la 10 pentru că ultima cifră ar fi 0-1 nu 10-1
  269. p=px(aux,aux);
  270. break;
  271. }
  272. else
  273. aux+=to_string(c);
  274. p=px(aux,aux);
  275. if(!mic(p,temp))
  276. {
  277. if(c==9)
  278. c--;
  279. break;
  280. }
  281. if(c!=9)
  282. aux.pop_back();
  283. }
  284. if(c==9)
  285. rez+=to_string(c);
  286. else
  287. rez+=--aux[0];
  288. p=dx(temp,px(aux,aux)); // aceaiasi poveste
  289. while(p[0]=='0')
  290. p.erase(p.begin()+0);
  291. if(p!="")
  292. temp=p;
  293. else
  294. temp="";
  295. continue;
  296. }
  297. while(c<9) // facem acelasi lucru numai ca de data asta dublam nu căutam patrat
  298. {
  299. c++;
  300. if(c==10)
  301. {
  302. aux+=to_string(--c);
  303. p=px(aux,to_string(c));
  304. break;
  305. }
  306. else
  307. aux+=to_string(c);
  308. p=px(aux,to_string(c));
  309. if(!mic(p,temp))
  310. {
  311. if(c==9)
  312. c--;
  313. break;
  314. }
  315. if(c!=9)
  316. aux.pop_back();
  317. }
  318. if(c==9)
  319. rez+=to_string(c);
  320. else
  321. rez+=--aux[aux.size()-1];
  322. c=aux[aux.size()-1]-'0';
  323. p=dx(temp,px(aux,to_string(c))); // calcumăm restul
  324. while(p[0]=='0')
  325. p.erase(p.begin()+0);
  326. if(p!="")
  327. temp=p;
  328. else
  329. temp="";
  330. }
  331. rez.insert(rez.begin()+k,'.'); // punem virgula
  332. c=rez.find('.'); // căutam dacă exista mai multe zecimale decat ne trebuie, stergem atat timp cat sunt mai multe
  333. while(rez.size()-1-c>8)
  334. rez.pop_back();
  335. if(ok) // punem I dacă era negative la inceput
  336. rez+='i';
  337. return rez; // GATA! Pfeu
  338. }
  339. int main()
  340. {
  341. string s;
  342. cin>>s;
  343. cout<<srx(s);
  344. }
Add Comment
Please, Sign In to add comment