Iamtui1010

1000!.c

Feb 3rd, 2023
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<conio.h>
  4.  
  5. #define long long long
  6. #define nln printf("%c", '\n');
  7.  
  8. typedef char bignum[1000000];
  9.  
  10. void inra(bignum N)
  11. {
  12.     printf("%s\n", N);
  13. }
  14.  
  15. void erase(bignum n, long x, long y) // erase bignum n, from index x, y character
  16. {
  17.     long l = strlen(n);
  18.     for (int i = x+y; i < l; ++i)
  19.         n[i-y] = n[i];
  20.     for (int i = l-y; i < l; ++i)
  21.         n[i] = 0;
  22. }
  23.  
  24. void del_zero(bignum str)
  25. {
  26.     while (str[0] == '0' && strlen(str) > 1)
  27.         erase(str, 0, 1);
  28. }
  29.  
  30. void fill0(bignum N, long n)
  31. {
  32.     N = strrev(N);
  33.     long l = strlen(N);
  34.     for (long i = 1; i < n-l+1; ++i)
  35.         N[l-1+i] = '0';
  36.     N = strrev(N);
  37. }
  38.  
  39. void reverse(char str[])
  40. {
  41.     long idx = strlen(str);
  42.     for (long i = 0; i < idx/2; ++i){
  43.         char tmp = str[i];
  44.         str[i] = str[idx-i-1];
  45.         str[idx-i-1] = tmp;
  46.     }
  47. }
  48.  
  49. const char* sum(bignum a, bignum b)
  50. {
  51.     if (strlen(a) < strlen(b))
  52.         fill0(a, strlen(b));
  53.     else
  54.         fill0(b, strlen(a));
  55.  
  56.     char res[10000] = "";
  57.     long rem = 0, idx = 0;
  58.     for (long i = strlen(b)-1; i >= 0; --i){
  59.         long msm = (a[i]-'0')+(b[i]-'0')+rem;
  60.         char c = msm % 10 + '0';
  61.         res[idx++] = c;
  62.         rem = msm / 10;
  63.     }
  64.  
  65.     if (rem != 0)
  66.         res[idx++] = rem+'0';
  67.    
  68.     reverse(res);
  69.  
  70.     // convers to return -> I still don't know why have to do this
  71.     char *rt = res;
  72.     return rt;
  73. }
  74.  
  75. const char* single_multi(bignum a, long b)
  76. {
  77.     char res[10000] = "";
  78.     long rem = 0, idx = 0;
  79.     for (long i = strlen(a)-1; i >= 0; --i){
  80.         long mmt = (a[i]-'0')*b+rem;
  81.         char c = mmt % 10 + '0';
  82.         res[idx++] = c;
  83.         rem = mmt / 10;
  84.     }
  85.  
  86.     if (rem != 0)
  87.         res[idx++] = rem+'0';
  88.  
  89.     reverse(res);
  90.  
  91.     char *rt = res;
  92.     del_zero(rt);
  93.     return rt;
  94. }
  95.  
  96. const char* multi(bignum a, bignum b)
  97. {
  98.     char res[10000] = "";
  99.     for (long i = strlen(b)-1; i >= 0; --i){
  100.         char smt[10000] = ""; strcpy(smt, single_multi(a, b[i]-'0'));
  101.         long add = strlen(b)-1-i;
  102.         long l = strlen(smt);
  103.         while (add--)
  104.             smt[l] = '0', l += 1;
  105.         char tmp[10000] = ""; strcpy(tmp, sum(res, smt));
  106.         strcpy(res, tmp);
  107.     }
  108.  
  109.     char *rt = res;
  110.     return rt;
  111. }
  112.  
  113. long fastpow(long a, long b)
  114. {
  115.     if (b == 0)
  116.         return 1;
  117.     long tmp = fastpow(a, b/2);
  118.     if (b % 2 == 1)
  119.         return tmp*tmp*a;
  120.     else
  121.         return tmp*tmp;
  122. }
  123.  
  124. long bignum2num(bignum n)
  125. {
  126.     long res = 0;
  127.     for (long i = 0; i < strlen(n); ++i)
  128.         res += (n[i]-'0')*fastpow(10, strlen(n)-i-1);
  129.     return res;
  130. }
  131.  
  132. const char *num2bignum(long n)
  133. {
  134.     char res[10000] = "";
  135.     long idx = 0;
  136.     while (n > 0){
  137.         char c = n % 10 + '0';
  138.         res[idx++] = c;
  139.         n /= 10;
  140.     }
  141.    
  142.     reverse(res);
  143.  
  144.     char *rt = res;
  145.     return rt;
  146. }
  147.  
  148.  
  149.  
  150. const char *factorial(long n)
  151. {
  152.     char res[10000] = "1";
  153.     n++;
  154.     while (n--)
  155.         if (n > 0){
  156.             char N[10000]; strcpy(N, num2bignum(n));
  157.             char tmp[10000]; strcpy(tmp, multi(res, N));
  158.             strcpy(res, tmp);
  159.         }
  160.  
  161.     char *rt = res;
  162.     return rt;
  163. }
  164.  
  165. int main()
  166. {
  167.     printf("Tinh giai thua cua: ");
  168.     long n;
  169.     scanf("%lli", &n);
  170.     printf("%s", factorial(n));
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment