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.

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

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.