Hướng dẫn giải của Convert to Decimal Base System
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 RR
//Written by Nguyen Thanh Trung {$R+,Q+} {$Mode objFPC} uses math; const FINP=''; FOUT=''; MAXN=101; type big=array[0..MAXN] of longint; operator + (a,b:big) c:big; var i,nho:longint; begin fillchar(c,sizeof(c),0); c[0]:=max(a[0],b[0]); nho:=0; for i:=1 to c[0] do begin c[i]:=a[i]+b[i]+nho; if c[i]<100 then nho:=0 else begin nho:=1; c[i]-=100; end; end; if nho>0 then begin inc(c[0]); c[c[0]]:=nho; end; end; operator * (a:big; k:longint) c:big; var i,nho:longint; begin fillchar(c,sizeof(c),0); c[0]:=a[0]; nho:=0; for i:=1 to c[0] do begin c[i]:=a[i]*k+nho; if c[i]<100 then nho:=0 else begin nho:=c[i] div 100; c[i]:=c[i] mod 100; end; end; if nho>0 then begin inc(c[0]); c[c[0]]:=nho; end; end; var f1,f2:text; procedure print(var a:big); inline; var i:longint; begin while (a[0]>0) and (a[a[0]]=0) do dec(a[0]); if a[0]=0 then begin writeln(f2,0); exit; end; for i:=a[0] downto 1 do if (a[i]<10) and (i<a[0]) then write(f2,'0',a[i]) else write(f2,a[i]); writeln(f2); end; var n:longint; val:array[char] of longint; lt:array[1..MAXN,0..MAXN] of big; s:string; procedure openF; begin assign(f1,FINP); reset(f1); assign(f2,FOUT); rewrite(f2); end; procedure closeF; begin close(f1); close(f2); end; procedure init; var base,i:longint; begin for base:=1 to 99 do begin lt[base,0][0]:=1; lt[base,0][1]:=1; for i:=1 to MAXN do lt[base,i]:=lt[base,i-1]*base; end; end; procedure input(var s:string;k:boolean); begin if k then repeat readln(f1,s); while s[1]=' ' do delete(s,1,1); while s[length(s)]=' ' do delete(s,length(s),1); if s='' then continue; while ord(s[1])<21 do delete(s,1,1); while ord(s[length(s)])<21 do delete(s,length(s),1); until s<>'' else begin readln(f1,s); while s[1]=' ' do delete(s,1,1); while s[length(s)]=' ' do delete(s,length(s),1); if s='' then exit; while ord(s[1])<21 do delete(s,1,1); while ord(s[length(s)])<21 do delete(s,length(s),1); end; end; var kq,sum:big; a:string; procedure solve; var i,maxbase,base,ln,now:longint; begin maxbase:=n; repeat input(a,false); if a='' then continue; ln:=0; for i:=1 to length(a) do ln:=max(ln,val[a[i]]); fillchar(sum,sizeof(sum),0); for base:=ln+1 to maxbase do begin fillchar(kq,sizeof(kq),0); now:=0; for i:=length(a) downto 1 do begin kq+=lt[base,now]*val[a[i]]; inc(now); end; sum+=kq; end; print(sum); until a=''; if not eof(f1) then writeln(f2); end; begin init; openF; while not eof(f1) do begin input(s,true); n:=length(s); for n:=1 to n do val[s[n]]:=n-1; solve; end; closeF; end.
Code mẫu của hieult
#include <cstdio> #include <stdio.h> #include <cstring> //#include <conio.h> #define bigbase 10000000 #define biglen 250 void big_intadd(int target[], int n) { int i; for( i = 1;n;i++) { if(i<=target[0]) n+= target[i]; target[i] = n%bigbase; n/=bigbase; } if(i-1>target[0]) target[0] = i-1; } void big_addto(int target[],int source[]) { int carry = 0,i; for(i = 1;(i<=target[0])|| (i<=source[0])||carry;i++) { if(i<=target[0]) carry+=target[i]; if(i<=source[0]) carry+=source[i]; target[i] = carry%bigbase; carry/= bigbase; } if(i-1>target[0]) target[0] = i-1; } void big_intmul(int target[],int n) { int carry = 0,i; for(i = 1;(i<=target[0])||carry;i++) { //printf("%d ",target[0]); if(i<=target[0]) carry+=n*target[i]; target[i] = carry%bigbase; carry/=bigbase; } if(i-1>target[0]) target[0] = i-1; } void big_print(int source[]) { int i; printf("%d",source[source[0]]); for(i=source[0]-1;i>0;i--) printf("%07d",source[i]); printf("\n"); } #define numlen 22222 char line[numlen]; int read_line(void) { int i,j; if(fgets(line,sizeof(line),stdin)==NULL) return -1; for(i=j=0;line[i];i++) if(line[i]>32) line[j++] = line[i]; line[j] = '\0'; return j; } int digitvalue[128]; int maxbase; void find_conversion(int len) { int i; for(int i = 0;i<len;i++) digitvalue[line[i]] = i; maxbase = len; } int digit[numlen]; int minbase; void convert_line(int len) { int i; minbase = 2; for(i = 0;i<len;i++) { digit[i] = digitvalue[line[i]]; if(digit[i]>=minbase) minbase = digit[i]+1; } } void to_bignum(int target[],int base,int len) { int i; target[0] = 0; for(i = 0;i<len;i++) { big_intmul(target,base); big_intadd(target,digit[i]); } } int main() { //freopen("MCONVERT.in","r",stdin); int len,cases =0,base,sum[biglen],number[biglen]; while((len = read_line())>=0) { if(len == 0) continue; if(cases++) printf("\n"); find_conversion(len); while((len=read_line())>0) { convert_line(len); sum[0] = 0; for(base = minbase;base<=maxbase;base++) { to_bignum(number,base,len); big_addto(sum,number); } big_print(sum); } if(len<0) break; } // getch(); }
Bình luận