a53

RADICAL_NR_MARI_PROP

a53
Feb 25th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.40 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)
  8. {
  9. int n1=str1.length(),n2=str2.length();
  10. if(n1<n2)
  11. return true;
  12. if(n1>n2)
  13. return false;
  14.  
  15. for(int i=0;i<n1;i++)
  16. {
  17. if(str1[i]<str2[i])
  18. return true;
  19. else
  20. if(str1[i]>str2[i])
  21. return false;
  22. }
  23. return false;
  24. }
  25.  
  26. string sx(string str1,string str2)
  27. {
  28. int ls=0,lss=0,o1=0,o2=0,ls1=0,ls2=0,lmax,len;
  29. if(str1.find('.')!=-1)
  30. ls=str1.find('.'),o1=1,ls1=ls;
  31. if(str2.find('.')!=-1)
  32. lss=str2.find('.'),o2=1,ls2=lss;
  33. lmax=max(ls,lss);
  34. len=max(str1.size(),str2.size());
  35. if(o1)
  36. {
  37. str1.erase(str1.begin()+ls),ls--;
  38. ls=str1.size()-1-ls;
  39. }
  40. if(o2)
  41. {
  42. str2.erase(str2.begin()+lss),lss--;
  43. lss=str2.size()-1-lss;
  44. }
  45. len=max(str1.size(),str2.size());
  46. if(ls>lss)
  47. for(int i=1;i<=ls-lss;i++)
  48. str2+='0';
  49. else
  50. if(lss>ls)
  51. for(int i=1;i<=lss-ls;i++)
  52. str1+='0';
  53. int t=0;
  54. if (str1.length()>str2.length())
  55. swap(str1,str2);
  56. string str="";
  57. int n1=str1.length(),n2=str2.length();
  58. int dif=n2-n1;
  59. for(int i=n1-1;i>=0;i--)
  60. {
  61. int sum=((str1[i]-'0')+(str2[i+dif]-'0')+t);
  62. str.push_back(sum%10+'0');
  63. t=sum/10;
  64. }
  65. for(int i=n2-n1-1;i>=0;i--)
  66. {
  67. int sum=((str2[i]-'0')+t);
  68. str.push_back(sum%10+'0');
  69. t=sum/10;
  70. }
  71. if(t)
  72. str.push_back(t+'0');
  73. reverse(str.begin(),str.end());
  74. if(ls || lss)
  75. str.insert(str.begin()+lmax+(str.size()-len),'.');
  76. return str;
  77. }
  78.  
  79. string px(string num1, string num2)
  80. {
  81. int n1=num1.size();
  82. int n2=num2.size();
  83. if(n1==0||n2==0)
  84. return "0";
  85. vector<int> rez(n1+n2,0);
  86. int i_n1=0;
  87. int i_n2=0;
  88. for(int i=n1-1;i>=0;i--)
  89. {
  90. int t=0;
  91. int n1=num1[i]-'0';
  92. i_n2=0;
  93. for(int j=n2-1;j>=0;j--)
  94. {
  95. int n2=num2[j]-'0';
  96. int sum=n1*n2+rez[i_n1+i_n2]+t;
  97. t=sum/10;
  98. rez[i_n1+i_n2]=sum%10;
  99. i_n2++;
  100. }
  101. if(t>0)
  102. rez[i_n1+i_n2]+=t;
  103. i_n1++;
  104. }
  105. int i=rez.size()-1;
  106. while(i>=0 && rez[i]==0)
  107. i--;
  108. if(i==-1)
  109. return "0";
  110. string s="";
  111. while(i>=0)
  112. s+=to_string(rez[i--]);
  113. return s;
  114. }
  115.  
  116. string dx(string str1,string str2)
  117. {
  118. int ls=0,lss=0,o1=0,o2=0,ls1=0,ls2=0,lmax,len;
  119. if(str1.find('.')!=-1)
  120. ls=str1.find('.'),o1=1,ls1=ls;
  121. if(str2.find('.')!=-1)
  122. lss=str2.find('.'),o2=1,ls2=lss;
  123. lmax=max(ls,lss);
  124. len=max(str1.size(),str2.size());
  125. if(o1)
  126. {
  127. str1.erase(str1.begin()+ls),ls--;
  128. ls=str1.size()-1-ls;
  129. }
  130. if(o2)
  131. {
  132. str2.erase(str2.begin()+lss),lss--;
  133. lss=str2.size()-1-lss;
  134. }
  135. len=max(str1.size(),str2.size());
  136. if(ls>lss)
  137. for(int i=1;i<=ls-lss;i++)
  138. str2+='0';
  139. else
  140. if(lss>ls)
  141. for(int i=1;i<=lss-ls;i++)
  142. str1+='0';
  143. if(mic(str1,str2))
  144. swap(str1,str2);
  145. string str = "";
  146. if(str1[0]=='0')
  147. return "0";
  148. int n1=str1.length(),n2=str2.length();
  149. int dif=n1-n2;
  150. int t=0;
  151. for(int i=n2-1;i>=0;i--)
  152. {
  153. int sub=((str1[i+dif]-'0')-(str2[i]-'0')-t);
  154. if(sub<0)
  155. sub+=10,t=1;
  156. else
  157. t=0;
  158. str.push_back(sub+'0');
  159. }
  160. for(int i=n1-n2-1;i>=0;i--)
  161. {
  162. if(str1[i]=='0'&&t)
  163. {
  164. str.push_back('9');
  165. continue;
  166. }
  167. int sub=((str1[i]-'0')-t);
  168. if (i>0||sub>0)
  169. str.push_back(sub+'0');
  170. t=0;
  171. }
  172. reverse(str.begin(),str.end());
  173. if(ls || lss)
  174. str.insert(str.begin()+lmax+(str.size()-len),'.');
  175. return str;
  176. }
  177.  
  178. string ddx(string s,string ss)
  179. {
  180. int m=2,ls=0,lss=0,o1=0,o2=0,p1=0,p2=0;
  181. if(s[0]=='-' || ss[0]=='-')
  182. {
  183. m=1;
  184. if(s[0]=='-' && ss[0]!='-')
  185. p1=1;
  186. if(s[0]!='-' && ss[0]=='-')
  187. p2=1;
  188.  
  189. }
  190. if(s[0]=='-' && ss[0]=='-')
  191. m=0;
  192. if(s[0]=='-')
  193. s.erase(s.begin()+0);
  194. if(ss[0]=='-')
  195. ss.erase(ss.begin()+0);
  196. if(s.find('.')!=-1)
  197. ls=s.find('.'),o1=1;
  198. if(ss.find('.')!=-1)
  199. lss=ss.find('.'),o2=1;
  200. if(o1)
  201. {
  202. s.erase(s.begin()+ls),ls--;
  203. ls=s.size()-1-ls;
  204. }
  205. if(o2)
  206. {
  207. ss.erase(ss.begin()+lss),lss--;
  208. lss=ss.size()-1-lss;
  209. }
  210. if(ls>lss)
  211. for(int i=1;i<=ls-lss;i++)
  212. ss+='0';
  213. else
  214. if(lss>ls)
  215. for(int i=1;i<=lss-ls;i++)
  216. s+='0';
  217. if(ss=="1")
  218. {
  219. return s;
  220. }
  221. if(s=="0")
  222. {
  223. return "0.000000";
  224. }
  225. string rez;
  226. if(mic(s,ss))
  227. rez="0.";
  228. while(mic(s,ss))
  229. {
  230. s+='0';
  231. if(!mic(s,ss) || (rez.size()-1-rez.find('.')==6 && rez.find('.')!=-1))
  232. break;
  233. rez+='0';
  234. }
  235. if(rez.find('.')!=-1)
  236. {
  237. if(rez.size()-1-rez.find('.')==6)
  238. return rez;
  239. else
  240. if(rez.size()-1-rez.find('.')<6 && rez.find('.')!=-1)
  241. {
  242. string temp;
  243. while(rez.size()-1-rez.find('.')<6)
  244. {
  245. int ap=0;
  246. while(!mic(s,ss))
  247. s=dx(s,ss),ap++;
  248. rez+=to_string(ap);
  249. s+='0';
  250. }
  251. return rez;
  252. }
  253. }
  254. string temp;
  255. int j,k=s.size(),ap=0;
  256. s+="000000000000000";
  257. for(int i=0;i<s.size() && mic(temp,ss);i++)
  258. temp+=s[i],j=i+1;
  259. while(!mic(temp,ss))
  260. temp=dx(temp,ss),ap++;
  261. rez+=to_string(ap);
  262. for(;j<s.size();j++)
  263. {
  264. while(temp[0]=='0')
  265. temp.erase(temp.begin()+0);
  266. if(rez.find('.')!=-1 && rez.size()-1-rez.find('.')==15)
  267. {
  268. if(m==1)
  269. rez.insert(rez.begin()+0,'-');
  270. return rez;
  271. }
  272. ap=0;
  273. if(j==k)
  274. {
  275. rez+='.';
  276. ls=max(ls,lss);
  277. }
  278. if(temp[0]=='0')
  279. temp="",temp+=s[j];
  280. else
  281. temp+=s[j];
  282. if(temp[0]=='0')
  283. {
  284. rez+='0';
  285. continue;
  286. }
  287. while(mic(temp,ss) && j<s.size())
  288. {
  289. rez+='0',temp+=s[++j];
  290. if(j==k)
  291. {
  292. rez+='.';
  293. ls=max(ls,lss);
  294. }
  295. if(rez.size()-1-rez.find('-')==15 && rez.find('.')!=-1)
  296. {
  297. if(m==1)
  298. rez.insert(rez.begin()+0,'-');
  299. return rez;
  300. }
  301. }
  302. while(!mic(temp,ss))
  303. temp=dx(temp,ss),ap++;
  304. rez+=to_string(ap);
  305. }
  306. if(m==1)
  307. rez.insert(rez.begin()+0,'-');
  308. return rez;
  309. }
  310.  
  311. string srx(string n)
  312. {
  313. int ok=0;
  314. if(n[0]=='-')
  315. ok=1,n.erase(n.begin()+0);
  316. string x=n,y="1",temp;
  317. while(1)
  318. {
  319. x=sx(x,y);
  320. x=ddx(x,"2");
  321. y=ddx(n,x);
  322. temp=dx(x,y);
  323. temp=temp.substr(temp.find('.')-1,10);
  324. if(temp=="0.00000000")
  325. break;
  326. }
  327. x.resize(8+x.find('.')+1);
  328. if(ok)
  329. x+='i';
  330. return x;
  331. }
  332.  
  333. int main()
  334. {
  335. string s;
  336. cin>>s;
  337. cout<<srx(s);
  338. }
Add Comment
Please, Sign In to add comment