- 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
package testapp;
public class TestApp {
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < 1000000; i++) {
if (isLucky(i)) {
System.out.println(i);
count++;
}
}
System.out.println("Total: " + count);
}
static boolean isLucky(final int n) {
String num = Integer.toString(n);
switch(6 - num.length()) {
case 1:
num = "0".concat(num);
break;
case 2:
num = "00".concat(num);
break;
case 3:
num = "000".concat(num);
break;
case 4:
num = "0000".concat(num);
break;
case 5:
num = "00000".concat(num);
break;
}
return (((getDigitAt(num, 0) + getDigitAt(num, 1) == getDigitAt(num, 2) + getDigitAt(num, 3))) & ((getDigitAt(num, 2) + getDigitAt(num, 3) == getDigitAt(num, 4) + getDigitAt(num, 5))));
}
static int getDigitAt(String number, int index) {
return Character.getNumericValue(number.charAt(index));
}
}
Моё. Проверяет числа на "счастливость". Число счастливое, если в 6-значном числе сумма каждой пары соседних цифр одинакова. Т.е 211221 - счастливое, т.к. (2+1) = (1+2) = (2+1)
Govnocoder#0xFF 09.05.2013 15:10 # 0
Не нравятся строки 30-32, но они оказываются самым быстрым и простым решением. Оставить или стоит заменить?
kipar 09.05.2013 22:52 # −1
static int getDigitAt(int number, int index) {
return number/((int)Math.pow(10, index-1)) % 10;
}
tirinox 10.05.2013 03:28 # +1
bormand 10.05.2013 08:31 # 0
> pow
А извращения с плавающей точкой тем более. К слову, то извращение со строками, скорее всего работало быстрее.
kipar 10.05.2013 12:47 # 0
bormand 10.05.2013 13:47 # 0
kipar 10.05.2013 14:51 # 0
guest 09.05.2013 23:03 # −3
[code=java]
static boolean isLucky(final int n) {
return ((n / 100000) + ((n / 10000) % 10) == ((n / 1000) % 10) + ((n / 100) % 10)) &&
((n / 100000) + ((n / 10000) % 10) == ((n / 10) % 10) + (n % 10));
}
[/code=java]
guest 09.05.2013 23:03 # −4
tirinox 10.05.2013 03:29 # +1
3.14159265 10.05.2013 15:17 # +4
bormand 10.05.2013 08:33 # 0
guest 10.05.2013 22:21 # 0
bormand 11.05.2013 06:49 # 0
bormand 11.05.2013 07:09 # 0
Всего в ~1.6 раза быстрее цикла.
guest 10.05.2013 22:03 # 0
if (s.length() % 2 > 0 || s.length() < 6) { cout << "NO"; return 0; }
int isOk = 1;
int tmp = -1;
for(int i = 0, len = (int)s.length(); i < len; i+=2)
{
int cur = s[i]+s[i+1];
if (tmp < 0) tmp = cur;
isOk *= (tmp == cur);
}
cout << ( (isOk) ? "YES" : "NO" );
return 0;
guest 10.05.2013 22:11 # +1
int n; cin >> n;
int len = (int)floor( log(n)/log(10.) ) + 1;
if (len % 2 > 0 || len < 6) { cout << "NO"; return 0; }
int tmp = -1;
while (n > 0)
{
int first = n % 10; n /= 10;
int second = n % 10; n /= 10;
if (tmp < 0) tmp = second + first;
if (tmp != second + first)
{ cout << "NO"; return 0; }
}
cout << "YES";
return 0;
Govnocoder#0xFF 11.05.2013 19:05 # 0
Можно вынести из цикла.
eth0 11.05.2013 11:58 # +1
с несколькими условиями в зависимости от длины.
Если на выходе есть строка, а функции форматирования a-la printf отсутствуют или некошерны, всегда есть возможность сделать так:
movaxbx 11.05.2013 12:38 # +1
upd. тьфу, это джава раздел
someone 12.05.2013 10:36 # +2
Fixed?
guest 14.05.2013 13:31 # 0
Fixed.
tir 13.05.2013 15:16 # 0
tir 13.05.2013 15:24 # 0
tir 13.05.2013 15:41 # 0
roman-kashitsyn 13.05.2013 15:49 # 0
tir 13.05.2013 15:58 # 0
bormand 13.05.2013 16:52 # 0
tir 13.05.2013 16:58 # 0
хотелось увидеть реализацию идей изложенных по ссылке.
ПС. По данной задаче 65 итераций цикла.