Advertisement
a53

b_i_p_r_i_m_e

a53
Oct 4th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. #define NMax 1000
  5. typedef int Huge[NMax+3];
  6. Huge n,m,UNU,D,RAD;
  7.  
  8. void AtribValue(Huge H, unsigned long X) {
  9. H[0] = 0;
  10. while (X) {
  11. ++H[0];
  12. H[H[0]] = X % 10;
  13. X /= 10;
  14. }
  15. }
  16.  
  17. void CopyValue(Huge A,Huge B) /// A <- B
  18. {
  19. for(int i=0;i<=B[0];++i)
  20. A[i]=B[i];
  21. }
  22.  
  23. void Shl(Huge H, int Count)
  24. /* H <- H*10ACount */
  25. {
  26. /* Shifteaza vectorul cu Count pozitii */
  27. memmove(&H[Count+1],&H[1],sizeof(int)*H[0]);
  28. /* Umple primele Count pozitii cu 0 */
  29. memset(&H[1],0,sizeof(int)*Count);
  30. /* Incrementeaza numarul de cifre */
  31. H[0]+=Count;
  32. }
  33.  
  34. void Shr(Huge H, int Count)
  35. /* H <- H/10ACount */
  36. {
  37. /* Shifteaza vectorul cu Count pozitii */
  38. memmove(&H[1],&H[Count+1],sizeof(int)*(H[0]-Count));
  39. /* Decrementeaza numarul de cifre */
  40. H[0]-=Count;
  41. }
  42.  
  43. void Add(Huge A, Huge B)
  44. /* A <- A+B */
  45. { int i,T=0;
  46.  
  47. if (B[0]>A[0])
  48. { for (i=A[0]+1;i<=B[0];) A[i++]=0;
  49. A[0]=B[0];
  50. }
  51. else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  52. for (i=1;i<=A[0];i++)
  53. { A[i]+=B[i]+T;
  54. T=A[i]/10;
  55. A[i]%=10;
  56. }
  57. if (T) A[++A[0]]=T;
  58. }
  59.  
  60. void MultHuge(Huge A, Huge B, Huge C)
  61. /* C <- A x B */
  62. { int i,j,T=0;
  63.  
  64. C[0]=A[0]+B[0]-1;
  65. for (i=1;i<=A[0]+B[0];) C[i++]=0;
  66. for (i=1;i<=A[0];i++)
  67. for (j=1;j<=B[0];j++)
  68. C[i+j-1]+=A[i]*B[j];
  69. for (i=1;i<=C[0];i++)
  70. { T=(C[i]+=T)/10;
  71. C[i]%=10;
  72. }
  73. if (T) C[++C[0]]=T;
  74. }
  75.  
  76. unsigned long Divide(Huge A, unsigned long X)
  77. /* A <- A/X si intoarce A%X */
  78. { int i;
  79. unsigned long R=0;
  80.  
  81. for (i=A[0];i;i--)
  82. { A[i]=(R=10*R+A[i])/X;
  83. R%=X;
  84. }
  85. while (!A[A[0]] && A[0]>1) A[0]--;
  86. return R;
  87. }
  88.  
  89. int Sgn(Huge H1, Huge H2) {
  90. // Elimina zero-urile semnificative, daca exista.
  91. while (H1[0] && !H1[H1[0]]) H1[0]--;
  92. while (H2[0] && !H2[H2[0]]) H2[0]--;
  93.  
  94. if (H1[0] < H2[0]) {
  95. return -1;
  96. } else if (H1[0] > H2[0]) {
  97. return +1;
  98. }
  99.  
  100. for (int i = H1[0]; i > 0; --i) {
  101. if (H1[i] < H2[i]) {
  102. return -1;
  103. } else if (H1[i] > H2[i]) {
  104. return +1;
  105. }
  106. }
  107. return 0;
  108. }
  109.  
  110. void Subtract(Huge x,Huge y) /// x <-- x-y
  111. {
  112. int i,j;
  113. for (i = 1; i <= x[0]; i++)
  114. if(x[i]>=y[i])
  115. x[i]-=y[i];
  116. else
  117. {
  118. j=i+1;
  119. while(x[j]==0)
  120. x[j++]=9;
  121. x[j]--;
  122. x[i]=10+x[i]-y[i];
  123. }
  124. for (; x[0] > 1 && !x[x[0]]; x[0]--); /// sa n-am zerouri nesemnificative
  125. }
  126.  
  127. void DivideHuge(Huge A,Huge B,Huge C,Huge R) /// A/B = C rest R */
  128. {
  129. int i;
  130. R[0]=0;C[0]=A[0]; /// Initializam restul R si catul C
  131. for(i=A[0];i;i--)
  132. {
  133. Shl(R,1);
  134. R[1]=A[i];
  135. C[i]=0;
  136. while(Sgn(B,R)!=1) /// Cat timp R e mai mare decat impartitorul, efectuam scaderi in mod repetat
  137. {
  138. C[i]++;
  139. Subtract(R,B);
  140. }
  141. }
  142. while(!C[C[0]]&&C[0]>1) /// Elimin zerourile nesemnificative
  143. C[0]--;
  144. }
  145.  
  146. void Afisare(Huge A)
  147. {
  148. for(unsigned int i=A[0];i>=1;--i)
  149. cout<<A[i];
  150. }
  151.  
  152. void radical(Huge ST,Huge DR) /// Cu cautare binare (intre 1 si D)
  153. {
  154. Huge JUM;
  155. CopyValue(JUM,ST);
  156. Add(JUM,DR);
  157. Divide(JUM,2);
  158. Huge RADP;
  159. MultHuge(JUM,JUM,RADP);
  160. int semn=Sgn(RADP,D);
  161. if(semn==0)
  162. {
  163. CopyValue(RAD,JUM);
  164. return;
  165. }
  166. if(semn==-1)
  167. Add(JUM,UNU),radical(JUM,DR);
  168. else
  169. Subtract(JUM,UNU),radical(ST,JUM);
  170. }
  171.  
  172. int main()
  173. {
  174. char s[30];
  175. Huge n,m;
  176. cin>>s;
  177. unsigned int L=strlen(s);
  178. for(unsigned int i=0;i<L;++i)
  179. n[L-i]=s[i]-'0';
  180. n[0]=L;
  181. cin>>s;
  182. L=strlen(s);
  183. for(unsigned int i=0;i<L;++i)
  184. m[L-i]=s[i]-'0';
  185. m[0]=L;
  186. AtribValue(UNU,1);
  187. Huge p;
  188. CopyValue(p,n);
  189. Subtract(p,m); /// p=n-m
  190. Add(p,UNU); /// p=n-m+1
  191. MultHuge(p,p,D); /// D=p*p
  192. Huge patru;
  193. AtribValue(patru,4);
  194. Huge np;
  195. MultHuge(n,patru,np); /// pp=p*4
  196. Subtract(D,np); /// D=p*p-4*n
  197. radical(UNU,D);
  198. Subtract(p,RAD);
  199. Divide(p,2);
  200. Afisare(p);
  201. cout<<' ';
  202. Huge cat,rest;
  203. DivideHuge(n,p,cat,rest);
  204. Afisare(cat);
  205. cout<<'\n';
  206. return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement