Advertisement
a53

conducta

a53
Dec 28th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. #define NMax 300
  4. using namespace std;
  5. typedef int Huge[NMax+3];
  6. ifstream f("conducta.in");
  7. ofstream g("conducta.out");
  8.  
  9. void Citire(Huge H)
  10. {
  11. char s[151];
  12. f.getline(s,151);
  13. int L=(int)strlen(s);
  14. H[0]=0;
  15. while(L)
  16. H[++H[0]]=s[--L]-'0';
  17. }
  18.  
  19. void Afisare(Huge A)
  20. {
  21. for(unsigned int i=A[0];i>=1;--i)
  22. g<<A[i];
  23. g<<'\n';
  24. }
  25.  
  26. void AtribValue(Huge H,unsigned long X)
  27. {
  28. H[0]=0;
  29. while (X)
  30. ++H[0],H[H[0]]=X%10,X/=10;
  31. }
  32.  
  33. void CopyValue(Huge A,Huge B) /// A <- B
  34. {
  35. for(int i=0;i<=B[0];++i)
  36. A[i]=B[i];
  37. }
  38.  
  39. void Add(Huge A, Huge B)
  40. /* A <- A+B */
  41. { int i,T=0;
  42.  
  43. if (B[0]>A[0])
  44. { for (i=A[0]+1;i<=B[0];) A[i++]=0;
  45. A[0]=B[0];
  46. }
  47. else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  48. for (i=1;i<=A[0];i++)
  49. { A[i]+=B[i]+T;
  50. T=A[i]/10;
  51. A[i]%=10;
  52. }
  53. if (T) A[++A[0]]=T;
  54. }
  55.  
  56. void Subtract(Huge A, Huge B)
  57. /* A <- A-B */
  58. { int i, T=0;
  59.  
  60. for (i=B[0]+1;i<=A[0];) B[i++]=0;
  61. for (i=1;i<=A[0];i++)
  62. A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
  63. /* Adica A[i]=A[i]-(B[i]+T);
  64. if (A[i]<0) T=1; else T=0;
  65. if (T) A[i]+=10; */
  66. while (!A[A[0]]) A[0]--;
  67. }
  68.  
  69. void MultHuge(Huge A, Huge B, Huge C)
  70. /* C <- A x B */
  71. { int i,j,T=0;
  72.  
  73. C[0]=A[0]+B[0]-1;
  74. for (i=1;i<=A[0]+B[0];) C[i++]=0;
  75. for (i=1;i<=A[0];i++)
  76. for (j=1;j<=B[0];j++)
  77. C[i+j-1]+=A[i]*B[j];
  78. for (i=1;i<=C[0];i++)
  79. { T=(C[i]+=T)/10;
  80. C[i]%=10;
  81. }
  82. if (T) C[++C[0]]=T;
  83. }
  84.  
  85. unsigned long Divide(Huge A, unsigned long X)
  86. /* A <- A/X si intoarce A%X */
  87. { int i;
  88. unsigned long R=0;
  89.  
  90. for (i=A[0];i;i--)
  91. { A[i]=(R=10*R+A[i])/X;
  92. R%=X;
  93. }
  94. while (!A[A[0]] && A[0]>1) A[0]--;
  95. return R;
  96. }
  97.  
  98. int Sgn(Huge H1, Huge H2) {
  99. // Elimina zero-urile semnificative, daca exista.
  100. while (H1[0] && !H1[H1[0]]) H1[0]--;
  101. while (H2[0] && !H2[H2[0]]) H2[0]--;
  102.  
  103. if (H1[0] < H2[0]) {
  104. return -1;
  105. } else if (H1[0] > H2[0]) {
  106. return +1;
  107. }
  108.  
  109. for (int i = H1[0]; i > 0; --i) {
  110. if (H1[i] < H2[i]) {
  111. return -1;
  112. } else if (H1[i] > H2[i]) {
  113. return +1;
  114. }
  115. }
  116. return 0;
  117. }
  118.  
  119. Huge UNU,RAD,X;
  120. void Radical(Huge ST,Huge DR)
  121. {
  122. Huge JUM;
  123. CopyValue(JUM,ST);
  124. Add(JUM,DR);
  125. Divide(JUM,2);
  126. Huge RADP;
  127. MultHuge(JUM,JUM,RADP);
  128. int semn=Sgn(RADP,X);
  129. if(semn==0)
  130. {
  131. CopyValue(RAD,JUM);
  132. return;
  133. }
  134. if(semn==-1)
  135. Add(JUM,UNU),Radical(JUM,DR);
  136. else
  137. Subtract(JUM,UNU),Radical(ST,JUM);
  138. }
  139.  
  140. int main(void)
  141. {
  142. Huge A,B,C;
  143. Citire(A),Citire(B),Citire(C);
  144. Add(A,B); /// A <- A+B
  145. MultHuge(A,A,B); /// B <- A*A
  146. MultHuge(C,C,X); /// X <- C*C
  147. Add(X,B); /// X <- X+B
  148. AtribValue(UNU,1);
  149. Radical(UNU,X);
  150. Afisare(RAD);
  151. return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement