Hướng dẫn giải của Chữ số tận cùng khác 0


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của happyboy99x

#include<cstdio>

/*
    http://math.stackexchange.com/questions/130352/last-non-zero-digit-of-a-factorial
    D(N) = 4D(N/5)D(N%10) if tens digit of N is odd
    D(N) = 6D(N/5)D(N%10) if tens digit of N is even
 */

const int d[] = {1, 1, 2, 6, 4, 2, 2, 4, 2, 8};

int D(int n) {
    if(n < 10) return d[n];
    return (n%100/10%2 ? 4 : 6) * D(n/5)*D(n%10)%10;
}

int main() {
    int n; scanf("%d", &n);
    printf("%d\n", D(n));
    return 0;
}

Code mẫu của RR

var
  nn,i,n,res,lt2,lt5:longint;
  t1:array[0..10] of longint;

function powInFac(n,k:longint):longint;
    begin
      if n<k then exit(0);
      exit(n div k+powInFac(n div k,k));
    end;

function power(a,k:longint):longint;
    var
      mid:longint;
    begin
      if k=0 then exit(1);
      if k=1 then exit(a);
      mid:=power(a,k shr 1);
      mid:=(mid*mid) mod 10;
      if k and 1=0 then exit(mid)
      else exit((mid*a) mod 10);
    end;

function get(n:longint):longint;
    var
      res:longint;
    begin
      res:=1;
      while (n>0) do
        begin
          res:=(res*power(t1[9],n div 10)*t1[n mod 10]) mod 10;
          n:=n shr 1;
        end;
      exit(res);
    end;

begin
  t1[0]:=1;
  for i:=1 to 9 do
    if (i and 1=1) and (i<>5) then t1[i]:=t1[i-1]*i
    else t1[i]:=t1[i-1];

  read(n); nn:=n;
  lt2:=powInFac(n,2);
  lt5:=powInFac(n,5);
  res:=power(2,lt2-lt5);
  res:=(res*get(n)) mod 10;

  n:=nn div 5;
  while (n>0) do
    begin
      res:=(res*get(n)) mod 10;
      n:=n div 5;
    end;
  writeln(res);
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>

int a[]={6,8,4,2,6,8,4};

int luythua(int k)
{
    if(k==0)
    return 1;
    return luythua(k-1)*5;
}

int tinh(int n)
{   
    int duoi=6;
    if(n==1||n==0)
    return 1;
    int x=n%10;
    int y=n/5;
    if(x==0) 
        duoi=6;
    else
    {
        for(int i=2;i<=x;i++)
            duoi=duoi*i;
        if(x>=5)
            duoi=duoi/5;
    }
    duoi=duoi%10;
    for(int i=0;i<=3;i++)
        {
            if(a[i]==duoi)
            {
                   duoi=a[i+y%4];
                   break;
            }
        }
    return (duoi*tinh(n/5))%10;
}

main()
{
      int n;
      scanf("%d",&n);
      printf("%d",tinh(n));
    //  getch();
}

Code mẫu của khuc_tuan

#include <stdio.h>
#include <string.h>
#define MAXN 1000

long a[MAXN], l;

void a_div_5(void)
{
   int i, plus;

   plus = 0;
   for (i=0; i<l; i++) {
      a[i] = a[i]*2+plus;
      plus = a[i]/10;
      a[i] = a[i]%10;
   }
   if (plus>0) a[l++] = plus;
   l--;
   for (i=0; i<l; i++) a[i] = a[i+1];
}

int main(void)
{
   char buffer[MAXN];
   long mod[20]={1,1,2,1,4,2,2,4,2,3,4,4,3,4,1,3,3,1,3,2};
   int result, n, i, plus, j, one;
   FILE *f, *g;

   f = stdin;
   g = stdout;

   while ( fscanf(f, "%s", buffer) != EOF) {
      l = strlen(buffer);

      for (i=0; i<l; i++) a[i] = buffer[l-1-i] - '0';
      one = l==1 && (a[0]==1 || a[0]==0);

      result = 1;
      while (l>0) {
         if (l==1) result = result * mod[a[0]] % 5;
         else      result = result * mod[a[0] + 10*(a[1]%2) ] % 5;
         a_div_5();
      }

      if (one || result%2==0) fprintf(g, "%d\n", result);
      else fprintf(g, "%d\n", result+5);

   }
   return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.