Hướng dẫn giải của VM 08 Bài 12 - Số 0 tận cùng
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.
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 flashmt
Copyconst max=10000; var a:array['a'..'z'] of longint; u2,u5:array[0..max] of longint; re,n:longint; procedure rf; var c:char; begin fillchar(a,sizeof(a),0); n:=0; while not eoln do begin inc(n); read(c); inc(a[c]); end; end; procedure init; var i,j:integer; begin fillchar(u2,sizeof(u2),0); fillchar(u5,sizeof(u5),0); for i:=1 to max do begin j:=i; u2[j]:=u2[j-1]; while j mod 2 = 0 do begin j:=j div 2; inc(u2[i]); end; end; for i:=1 to max do begin j:=i; u5[j]:=u5[j-1]; while j mod 5 = 0 do begin j:=j div 5; inc(u5[i]); end; end; end; procedure pr; var c:char; k,t2,t5:longint; begin init; t2:=0; t5:=0; re:=0; for c:='a' to 'z' do if a[c]>0 then begin k:=a[c]; t2:=t2+u2[n]-u2[k]-u2[n-k]; t5:=t5+u5[n]-u5[k]-u5[n-k]; n:=n-a[c]; end; if t2>t5 then re:=t5 else re:=t2; end; procedure wf; begin write(re); end; begin rf; pr; wf; end.
Code mẫu của ladpro98
Copyprogram digit0; uses math; const fi=''; var mu:array[1..6] of longint; mu2:array[1..14] of longint; ch:array['a'..'z'] of longint; inp:text; c:char; n:longint; s:ansistring; res1,res2:int64; procedure input; var c:char; begin assign(inp,fi); reset(inp); n:=0; readln(inp,s); n:=length(s); close(inp); end; procedure init; var i:longint; begin mu[1]:=5; for i:=2 to 6 do begin mu[i]:=mu[i-1]*5; end; mu2[1]:=2; for i:=2 to 14 do mu2[i]:=mu2[i-1]*2; for i:=1 to n do inc(ch[s[i]]); end; function calc(k:longint):longint; var i,t:longint; begin i:=1; t:=0; while mu[i]<=k do begin inc(t,trunc(k/mu[i])); inc(i); end; exit(t); end; function calc2(k:longint):longint; var i,t:longint; begin i:=1; t:=0; while mu2[i]<=k do begin inc(t,trunc(k/mu2[i])); inc(i); end; exit(t); end; begin input; init; res1:=calc(n); res2:=calc2(n); for c:='a' to 'z' do begin if ch[c]>=5 then dec(res1,calc(ch[c])); if ch[c]>=2 then dec(res2,calc2(ch[c])); end; write(min(res1,res2)); end.
Code mẫu của RR
Copyuses math; var a:ansistring; lt2,lt5,i,n:longint; c:char; cnt:array['a'..'z'] of longint; function get(n,k:longint):longint; begin if n<k then exit(0); exit(n div k+get(n div k,k)); end; begin readln(a); n:=length(a); for i:=1 to n do inc(cnt[a[i]]); lt2:=get(n,2); for c:='a' to 'z' do lt2:=lt2-get(cnt[c],2); lt5:=get(n,5); for c:='a' to 'z' do lt5:=lt5-get(cnt[c],5); writeln(min(lt2,lt5)); end.
Code mẫu của hieult
Copy#include <stdio.h> #include <string.h> //#include <conio.h> int min(int a,int b) { if(a>b) return b; return a; } main() { char s[10001]; int n,a[123],m=0,h=0; gets(s); n=strlen(s); if(n==0) printf("1"); else { for(int i=97;i<=122;i++) { a[i]=0; for(int j=0;j<n;j++) if(s[j]==("%c",i)) a[i]++; } int k=n; while(k!=0) { k=k/5; m+=k; } for(int i=97;i<=122;i++) { k = a[i]; while(k!=0) { k=k/5; m=m-k; } } k = n; while(k!=0) { k=k/2; h+=k; } for(int i=97;i<=122;i++) { k = a[i]; while(k!=0) { k=k/2; h=h-k; } } printf("%d",min(m,h)); } //getch(); }
Code mẫu của ll931110
CopyProgram DIGIT0; Const input = ''; output = ''; Var F: array['a'..'z'] of longint; s: ansistring; n: longint; Procedure init; Var fi: text; i: longint; Begin Assign(fi, input); Reset(fi); Readln(fi, s); n:= length(s); For i:= 1 to n do inc(F[s[i]]); Close(fi); End; Function divsum(n,k: longint): longint; Var t: longint; res: longint; Begin res:= 0; t:= 1; While t <= n do Begin t:= t * k; res:= res + n div t; End; divsum:= res; End; Procedure solve; Var fo: text; ch: char; c2,c5: longint; Begin c2:= divsum(n,2); For ch:= 'a' to 'z' do c2:= c2 - divsum(F[ch],2); c5:= divsum(n,5); For ch:= 'a' to 'z' do c5:= c5 - divsum(F[ch],5); Assign(fo, output); Rewrite(fo); If c2 > c5 then writeln(fo, c5) else writeln(fo, c2); Close(fo); End; Begin init; solve; End.
Code mẫu của skyvn97
Copy#include<stdio.h> #include<string.h> #define MAX 10101 int a[33]; int n; int n2,n5; int p2[MAX]; int p5[MAX]; char s[MAX]; void process(void) { int i,j; scanf("%s",s); n=strlen(s); for (i=1;i<=30;i=i+1) a[i]=0; n2=0; n5=0; for (i=1;i<=n;i=i+1) { a[s[i-1]-'a'+1]++; if (i%2==0) p2[i]=p2[i/2]+1; else p2[i]=0; if (i%5==0) p5[i]=p5[i/5]+1; else p5[i]=0; n2=n2+p2[i]; n5=n5+p5[i]; } for (i=1;i<=30;i=i+1) for (j=1;j<=a[i];j=j+1) { n2=n2-p2[j]; n5=n5-p5[j]; } if (n2>n5) printf("%d",n5); else printf("%d",n2); } int main(void) { process(); }
Code mẫu của khuc_tuan
Copy#include <cstdio> using namespace std; char a[10010]; int dem[26], n; int sl5[10010], sl2[10010]; int main() { gets(a); for(int i=0;a[i]!=0;++i) ++dem[a[i]-'a'], ++n; #define doit(A,B) { for(int i=1;B*i<=n;++i) A[B*i] = A[i] + 1; for(int i=1;i<=n;++i) A[i] += A[i-1]; } doit(sl5,5) doit(sl2,2) #define get(r,A) { r = A[n]; for(int i=0;i<26;++i) r -= A[dem[i]]; } int r2, r5; get(r2,sl2) get(r5,sl5) printf("%d\n", r2<r5?r2:r5); return 0; }
Bình luận