a53

SqrtXXL

a53
May 3rd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.70 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. bool mic(string str1,string str2)
  5. {
  6. int n1=str1.length(),n2=str2.length();
  7. if(n1<n2)
  8. return true;
  9. if(n1>n2)
  10. return false;
  11.  
  12. for(int i=0;i<n1;i++)
  13. {
  14. if(str1[i]<str2[i])
  15. return true;
  16. else
  17. if(str1[i]>str2[i])
  18. return false;
  19. }
  20. return true;
  21. }
  22.  
  23. string sx(string str1,string str2)
  24. {
  25. int ls=0,lss=0,o1=0,o2=0,lmax,len;
  26. if(str1.find('.')!=-1)
  27. ls=str1.find('.'),o1=1;
  28. if(str2.find('.')!=-1)
  29. lss=str2.find('.'),o2=1;
  30. lmax=max(ls,lss);
  31. len=max(str1.size(),str2.size());
  32. if(o1)
  33. {
  34. str1.erase(str1.begin()+ls),ls--;
  35. ls=str1.size()-1-ls;
  36. }
  37. if(o2)
  38. {
  39. str2.erase(str2.begin()+lss),lss--;
  40. lss=str2.size()-1-lss;
  41. }
  42. len=max(str1.size(),str2.size());
  43. if(ls>lss)
  44. for(int i=1;i<=ls-lss;i++)
  45. str2+='0';
  46. else
  47. if(lss>ls)
  48. for(int i=1;i<=lss-ls;i++)
  49. str1+='0';
  50. int t=0;
  51. if (str1.length()>str2.length())
  52. swap(str1,str2);
  53. string str="";
  54. int n1=str1.length(),n2=str2.length();
  55. int dif=n2-n1;
  56. for(int i=n1-1;i>=0;i--)
  57. {
  58. int sum=((str1[i]-'0')+(str2[i+dif]-'0')+t);
  59. str.push_back(sum%10+'0');
  60. t=sum/10;
  61. }
  62. for(int i=n2-n1-1;i>=0;i--)
  63. {
  64. int sum=((str2[i]-'0')+t);
  65. str.push_back(sum%10+'0');
  66. t=sum/10;
  67. }
  68. if(t)
  69. str.push_back(t+'0');
  70. reverse(str.begin(),str.end());
  71. if(ls || lss)
  72. str.insert(str.begin()+lmax+(str.size()-len),'.');
  73. return str;
  74. }
  75.  
  76. string px(string num1, string num2)
  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--;
  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),'.');
  139. return s;
  140. }
  141.  
  142. string dx(string str1,string str2)
  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());
  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),'.');
  201. return str;
  202. }
  203.  
  204. string srx(string s)
  205. {
  206. string rez,temp,aux,p;
  207. int ok=0,k,o=0,c=0,l;
  208. if(s[0]=='-')
  209. ok=1,s.erase(s.begin()+0);
  210. if(s.find('.')==-1)
  211. {
  212. l=s.size();
  213. if(s.size()%2)
  214. k=s.size()/2+1;
  215. else
  216. k=s.size()/2;
  217. }
  218. else
  219. {
  220. k=s.find('.'),s.erase(s.begin()+k);
  221. l=k;
  222. if(k%2)
  223. k=k/2+1;
  224. else
  225. k/=2;
  226. }
  227. s+="0000000000000000";
  228. if(l%2)
  229. {
  230. o=1;
  231. temp+=s[0];
  232. while(c<9)
  233. {
  234. aux+=to_string(c++);
  235. p=px(aux,aux);
  236. if(!mic(p,temp))
  237. break;
  238. aux.pop_back();
  239. }
  240. rez+=--aux[0];
  241. p=dx(temp,px(aux,aux));
  242. while(p[0]=='0')
  243. p.erase(p.begin()+0);
  244. if(p!="")
  245. temp=p;
  246. else
  247. temp="";
  248. }
  249. for(int i=o;i<s.size();)
  250. {
  251. c=-1;
  252. temp+=s[i++];
  253. temp+=s[i++];
  254. if(temp=="00")
  255. {
  256. rez+='0';
  257. temp="";
  258. continue;
  259. }
  260. if(aux!="")
  261. aux=px(rez,"2");
  262. else
  263. {
  264. while(c<9)
  265. {
  266. c++;
  267. if(c==10)
  268. {
  269. aux+=to_string(--c);
  270. p=px(aux,aux);
  271. break;
  272. }
  273. else
  274. aux+=to_string(c);
  275. p=px(aux,aux);
  276. if(!mic(p,temp))
  277. {
  278. if(c==9)
  279. c--;
  280. break;
  281. }
  282. if(c!=9)
  283. aux.pop_back();
  284. }
  285. if(c==9)
  286. rez+=to_string(c);
  287. else
  288. rez+=--aux[0];
  289. p=dx(temp,px(aux,aux));
  290. while(p[0]=='0')
  291. p.erase(p.begin()+0);
  292. if(p!="")
  293. temp=p;
  294. else
  295. temp="";
  296. continue;
  297. }
  298. while(c<9)
  299. {
  300. c++;
  301. if(c==10)
  302. {
  303. aux+=to_string(--c);
  304. p=px(aux,to_string(c));
  305. break;
  306. }
  307. else
  308. aux+=to_string(c);
  309. p=px(aux,to_string(c));
  310. if(!mic(p,temp))
  311. {
  312. if(c==9)
  313. c--;
  314. break;
  315. }
  316. if(c!=9)
  317. aux.pop_back();
  318. }
  319. if(c==9)
  320. rez+=to_string(c);
  321. else
  322. rez+=--aux[aux.size()-1];
  323. c=aux[aux.size()-1]-'0';
  324. p=dx(temp,px(aux,to_string(c)));
  325. while(p[0]=='0')
  326. p.erase(p.begin()+0);
  327. if(p!="")
  328. temp=p;
  329. else
  330. temp="";
  331. if(rez.size()-k>8 && k<rez.size())
  332. break;
  333. }
  334. rez.insert(rez.begin()+k,'.');
  335. c=rez.find('.');
  336. while(rez.size()-1-c>8)
  337. rez.pop_back();
  338. if(ok)
  339. rez+='i';
  340. return rez;
  341. }
  342.  
  343. int main()
  344. {
  345. string s;
  346. cin>>s;
  347. cout<<srx(s);
  348. }
Add Comment
Please, Sign In to add comment