- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
private void run() throws Exception {
Scanner s = new Scanner(new File("input.txt"));
PrintWriter p = new PrintWriter(new File("output.txt"));
int n = s.nextInt();
int sum = 0;
init();
for(int i = 1; i <= n; i++) {
sum += find(i);
}
p.print(sum);
s.close();
p.close();
}
private void init() {
for(int i = 0; i < 100; i++) {
pow_2[i] = (int) Math.pow(2, i + 1);
}
for(int i = 0; i < 100; i++) {
pow_3[i] = (int) Math.pow(3, i + 1);
}
for(int i = 0; i < 100; i++) {
pow_4[i] = (int) Math.pow(4, i + 1);
}
for(int i = 0; i < 100; i++) {
pow_5[i] = (int) Math.pow(5, i + 1);
}
}
private int find(int num) {
for(int i = 0; i < 100; i++) {
if(pow_2[i] == num) return 2;
if(num > pow_2[99]) break;
}
for(int i = 0; i < 100; i++) {
if(pow_3[i] == num) return 3;
if(num > pow_3[99]) break;
}
for(int i = 0; i < 100; i++) {
if(pow_4[i] == num) return 4;
if(num > pow_4[99]) break;
}
for(int i = 0; i < 100; i++) {
if(pow_5[i] == num) return 5;
if(num > pow_5[99]) break;
}
return 0;
}
Говнолаба... есть идеи как оптимизировать по скорости?
zhekka3 19.01.2012 19:06 # +3
roman-kashitsyn 19.01.2012 19:27 # +2
Для двойки это просто условие (число 1 битов = 1 и само число > 1).
Для четвёрки похоже (число 1 битов = 1, само число > 3 и 1 бит стоит в нечётной позиции).
Для остальных можно тупо в цикле делить и проверять что остаток всегда 0.
UncleAli 19.01.2012 19:51 # +1
roman-kashitsyn 20.01.2012 09:54 # 0
Nyashka 19.01.2012 20:59 # 0
istem 19.01.2012 19:09 # +5
Есть. Возьмите кирпич
Nyashka 19.01.2012 21:05 # −1
UncleAli 19.01.2012 21:27 # 0
Вы ошиблись ресурсом. Здесь люди над говнецом смеются, а не советы раздают.
Nyashka 19.01.2012 21:51 # −2
3.14159265 19.01.2012 19:51 # −2
Попробуй Си.
Nyashka 19.01.2012 20:58 # 0