首页 > ACM题库 > POJ 3027 Base equality [解题报告] Java
2013
11-12

POJ 3027 Base equality [解题报告] Java

Base equality

问题描述 :

Numerous are the moments I as a programmer have been frustrated by the tedious conversions between decimal numbers and hexadecimal ones. Why have we chosen 10 as a base in our everyday numerical presentations, when 16 seems so practically appealing? Obviously because everyone is not the computer geek I am. Maybe some day the world will fully realise the benefits of the hexadecimal system. In the meantime I have to learn to master the base conversions since most of the time numbers do not resemble one another in different bases.

Sometimes peculiar relationships emerge among the different base representations of numbers though. For instance, I noticed just the other day that 104010 * 4 = 104016, i.e. (1*103+0*102+4*101+0*100)*4=(1*163+0*162+4*161+0*160). It made me wonder how often this is the case, that is, the digits of a number in one base, are exactly the same as the digits of a multiple of the number in another base. Formally, let B1 < B2 be positive integers, and a0,a1,…,ak be integers in [0…B1-1]. For which ai’s is there a positive integer c such that

输入:

On the first line of input is a positive integer n telling the number of test cases that follow. Each test case is on a line of its own and consists of two integer bases B1, B2, 9 <= B1 < B2 <= 100, and two integer range elements, r1, and r2, 0 < r1 < r2 <= 10000. Notice that all numbers in the input are given in the base 10.

输出:

For each test case, there should be one row containing the largest integer i, fulfilling r1 < i < r2, for which there is a positive integer c such that the digits of i in the base B1, are exactly the same as the digits of i*c in the base B2. If no such integer i exists, output the text ‘Non-existent.’.

样例输入:

4
10 16 1 2000
10 16 1 4999
10 14 10 9999
11 14 10 9999

样例输出:

1040
4240
Non-existent.
9240

解题代码:

/* @author:[email protected] */
import java.util.*;
public class Main {

 static public void main( String [] str ){

  Scanner sc=new Scanner(System.in);
  int tt=sc.nextInt();
  while(( tt--)!=0 ) { 
    int a, b, r1, r2, t, r, s;
    a=sc.nextInt();
    b=sc.nextInt();
    r1=sc.nextInt();
    r2=sc.nextInt();
    for( r2--; r2>r1; r2-- ) {
	r = r2; t = 0; s = 1;
	while( r!=0 ) {
	  t += (r%a)*s;
	  s *= b;
	  r/=a;
	}
	if( t % r2 == 0 )
	  break;
    }
    if( r2 > r1 )
	System.out.printf( "%d\n", r2 );
    else
	System.out.printf( "Non-existent.\n" );
   }
  }
}

  1. 第二块代码if(it != mp.end())应改为if(it != mp.end() && (i+1)!=(it->second +1));因为第二种解法如果数组有重复元素 就不正确

  2. 我还有个问题想请教一下,就是感觉对于新手来说,递归理解起来有些困难,不知有没有什么好的方法或者什么好的建议?

  3. #include <cstdio>
    #include <algorithm>

    struct LWPair{
    int l,w;
    };

    int main() {
    //freopen("input.txt","r",stdin);
    const int MAXSIZE=5000, MAXVAL=10000;
    LWPair sticks[MAXSIZE];
    int store[MAXSIZE];
    int ncase, nstick, length,width, tmp, time, i,j;
    if(scanf("%d",&ncase)!=1) return -1;
    while(ncase– && scanf("%d",&nstick)==1) {
    for(i=0;i<nstick;++i) scanf("%d%d",&sticks .l,&sticks .w);
    std::sort(sticks,sticks+nstick,[](const LWPair &lhs, const LWPair &rhs) { return lhs.l>rhs.l || lhs.l==rhs.l && lhs.w>rhs.w; });
    for(time=-1,i=0;i<nstick;++i) {
    tmp=sticks .w;
    for(j=time;j>=0 && store >=tmp;–j) ; // search from right to left
    if(j==time) { store[++time]=tmp; }
    else { store[j+1]=tmp; }
    }
    printf("%dn",time+1);
    }
    return 0;
    }

  4. #include <cstdio>
    #include <cstring>

    const int MAXSIZE=256;
    //char store[MAXSIZE];
    char str1[MAXSIZE];
    /*
    void init(char *store) {
    int i;
    store['A']=’V', store['B']=’W',store['C']=’X',store['D']=’Y',store['E']=’Z';
    for(i=’F';i<=’Z';++i) store =i-5;
    }
    */
    int main() {
    //freopen("input.txt","r",stdin);
    //init(store);
    char *p;
    while(fgets(str1,MAXSIZE,stdin) && strcmp(str1,"STARTn")==0) {
    if(p=fgets(str1,MAXSIZE,stdin)) {
    for(;*p;++p) {
    //*p=store[*p]
    if(*p<’A’ || *p>’Z') continue;
    if(*p>’E') *p=*p-5;
    else *p=*p+21;
    }
    printf("%s",str1);
    }
    fgets(str1,MAXSIZE,stdin);
    }
    return 0;
    }