Advertisement
a53

RADICAL_NOU

a53
Oct 3rd, 2018
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 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.  
  7. void AtribValue(Huge H, unsigned long X) {
  8. H[0] = 0;
  9. while (X) {
  10. ++H[0];
  11. H[H[0]] = X % 10;
  12. X /= 10;
  13. }
  14. }
  15.  
  16. void CopyValue(Huge A,Huge B) /// A <- B
  17. {
  18. for(int i=0;i<=B[0];++i)
  19. A[i]=B[i];
  20. }
  21.  
  22. void Shl(Huge H, int Count)
  23. /* H <- H*10ACount */
  24. {
  25. /* Shifteaza vectorul cu Count pozitii */
  26. memmove(&H[Count+1],&H[1],sizeof(int)*H[0]);
  27. /* Umple primele Count pozitii cu 0 */
  28. memset(&H[1],0,sizeof(int)*Count);
  29. /* Incrementeaza numarul de cifre */
  30. H[0]+=Count;
  31. }
  32.  
  33. void Shr(Huge H, int Count)
  34. /* H <- H/10ACount */
  35. {
  36. /* Shifteaza vectorul cu Count pozitii */
  37. memmove(&H[1],&H[Count+1],sizeof(int)*(H[0]-Count));
  38. /* Decrementeaza numarul de cifre */
  39. H[0]-=Count;
  40. }
  41.  
  42. void Add(Huge A, Huge B)
  43. /* A <- A+B */
  44. { int i,T=0;
  45.  
  46. if (B[0]>A[0])
  47. { for (i=A[0]+1;i<=B[0];) A[i++]=0;
  48. A[0]=B[0];
  49. }
  50. else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  51. for (i=1;i<=A[0];i++)
  52. { A[i]+=B[i]+T;
  53. T=A[i]/10;
  54. A[i]%=10;
  55. }
  56. if (T) A[++A[0]]=T;
  57. }
  58.  
  59. void MultHuge(Huge A, Huge B, Huge C)
  60. /* C <- A x B */
  61. { int i,j,T=0;
  62.  
  63. C[0]=A[0]+B[0]-1;
  64. for (i=1;i<=A[0]+B[0];) C[i++]=0;
  65. for (i=1;i<=A[0];i++)
  66. for (j=1;j<=B[0];j++)
  67. C[i+j-1]+=A[i]*B[j];
  68. for (i=1;i<=C[0];i++)
  69. { T=(C[i]+=T)/10;
  70. C[i]%=10;
  71. }
  72. if (T) C[++C[0]]=T;
  73. }
  74.  
  75. unsigned long Divide(Huge A, unsigned long X)
  76. /* A <- A/X si intoarce A%X */
  77. { int i;
  78. unsigned long R=0;
  79.  
  80. for (i=A[0];i;i--)
  81. { A[i]=(R=10*R+A[i])/X;
  82. R%=X;
  83. }
  84. while (!A[A[0]] && A[0]>1) A[0]--;
  85. return R;
  86. }
  87.  
  88. int Sgn(Huge H1, Huge H2) {
  89. // Elimina zero-urile semnificative, daca exista.
  90. while (H1[0] && !H1[H1[0]]) H1[0]--;
  91. while (H2[0] && !H2[H2[0]]) H2[0]--;
  92.  
  93. if (H1[0] < H2[0]) {
  94. return -1;
  95. } else if (H1[0] > H2[0]) {
  96. return +1;
  97. }
  98.  
  99. for (int i = H1[0]; i > 0; --i) {
  100. if (H1[i] < H2[i]) {
  101. return -1;
  102. } else if (H1[i] > H2[i]) {
  103. return +1;
  104. }
  105. }
  106. return 0;
  107. }
  108.  
  109. void Subtract(Huge A, Huge B)
  110. /* A <- A-B */
  111. { int i, T=0;
  112.  
  113. for (i=B[0]+1;i<=A[0];) B[i++]=0;
  114. for (i=1;i<=A[0];i++)
  115. A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
  116. /* Adica A[i]=A[i]-(B[i]+T);
  117. if (A[i]<0) T=1; else T=0;
  118. if (T) A[i]+=10; */
  119. while (!A[A[0]]) A[0]--;
  120. }
  121.  
  122. void DivideHuge(Huge A, Huge B)
  123. /* A/B = C rest R */
  124. { int i;
  125.  
  126. Huge C,R;
  127. R[0]=0;C[0]=A[0];
  128. for (i=A[0];i;i--)
  129. { Shl(R,1);R[1]=A[i];
  130. C[i]=0;
  131. while (Sgn(B,R)!=1)
  132. { C[i]++;
  133. Subtract(R,B);
  134. }
  135. }
  136. while (!C[C[0]] && C[0]>1) C[0]--;
  137. CopyValue(A,C);
  138. }
  139.  
  140. /*
  141. float radical(float a)
  142. {
  143. // avand valoarea egala cu precizia dorita in calculul radicalului
  144. float xn1=1, xn=(1+xn1)/2;
  145. do { xn1=xn;
  146. xn = (xn1+a/xn1)/2;
  147. } while (fabs(xn-xn1)>eps);
  148. // fabs(x) = |x|, unde x este numar real
  149. return xn;
  150. // rezultatul este ultimul termen calculat al sirului
  151. }
  152. */
  153.  
  154. void radical(Huge A,Huge XN)
  155. {
  156. Huge XN1,C;
  157. AtribValue(XN1,1);
  158. AtribValue(XN,2);
  159. int semn;
  160. do
  161. {
  162. CopyValue(C,A);
  163. DivideHuge(C,XN1);
  164. CopyValue(XN,XN1);
  165. Add(XN,C);
  166. Divide(XN,2);
  167. semn=Sgn(XN,XN1);
  168. } while(semn==-1);
  169. }
  170.  
  171. void Afisare(Huge A)
  172. {
  173. for(unsigned int i=A[0];i>=1;--i)
  174. cout<<A[i];
  175. cout<<'\n';
  176. }
  177.  
  178. int main()
  179. {
  180. char s[30];
  181. Huge n,m;
  182. cin>>s;
  183. unsigned int L=strlen(s);
  184. for(unsigned int i=0;i<L;++i)
  185. n[L-i]=s[i]-'0';
  186. n[0]=L;
  187. cin>>s;
  188. L=strlen(s);
  189. for(unsigned int i=0;i<L;++i)
  190. m[L-i]=s[i]-'0';
  191. m[0]=L;
  192. Afisare(n);
  193. Afisare(m);
  194. Huge RAD;
  195. radical(n,RAD);
  196. cout<<RAD[0];
  197. Afisare(RAD);
  198. return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement