UVA11005




Sample Input
2
10 8 12 13 15 13 13 16 9
11 18 24 21 23 23 23 13 15
17 33 21 23 27 26 27 19 4
22 18 30 30 24 16 26 21 21
5
98329921
12345
800348
14
873645
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
4
0
1
10
100

Output for Sample Input
Case 1:
Cheapest base(s) for number 98329921: 24
Cheapest base(s) for number 12345: 13 31
Cheapest base(s) for number 800348: 31
Cheapest base(s) for number 14: 13
Cheapest base(s) for number 873645: 22

Case 2:
Cheapest base(s) for number 0: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Cheapest base(s) for number 1: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Cheapest base(s) for number 10: 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Cheapest base(s) for number 100: 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

大意:給一數字 求耗費最低的進制數字

解法:borce

import java.util.Scanner;

public class UVA11005 {

public static int value[] = new int[36];
public static int store_result[] = new int[36];

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

int count = sc.nextInt();

for (int c = 1; c <=count; c++) {

if(c!=1)System.out.println();
System.out.println("Case "+c+":");

int j = 0, number = 0;

for (j = 0; j < 36; j++) {
 value[j] = sc.nextInt();
}

number = sc.nextInt();

for (int n = 0; n < number; n++)

{
 int cheap = Integer.MAX_VALUE;

 int num = sc.nextInt();

 System.out.print("Cheapest base(s) for number "+num+":");

 for (int divisor = 1; divisor < 36; divisor++) {

  store_result[divisor] = cal(divisor + 1, num);

  if (store_result[divisor] < cheap) {

   cheap = store_result[divisor];
  }

 }


 for (int i = 1; i < 36; i++) {

  if (cheap == store_result[i])
  {

   System.out.print(" "+(i + 1));

  }
 }

 System.out.println();
}

}
}
sc.close();
}

public static int cal(int divisor, int num) {

int cal_value = 0;

while (true) {

if(num==0)break;

cal_value += value[num % divisor];

num /= divisor;
}
return cal_value;
}
}