- 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)
Не нравятся строки 30-32, но они оказываются самым быстрым и простым решением. Оставить или стоит заменить?
static int getDigitAt(int number, int index) {
return number/((int)Math.pow(10, index-1)) % 10;
}
> pow
А извращения с плавающей точкой тем более. К слову, то извращение со строками, скорее всего работало быстрее.
[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]
Всего в ~1.6 раза быстрее цикла.
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;
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;
Можно вынести из цикла.
с несколькими условиями в зависимости от длины.
Если на выходе есть строка, а функции форматирования a-la printf отсутствуют или некошерны, всегда есть возможность сделать так:
upd. тьфу, это джава раздел
Fixed?
Fixed.
хотелось увидеть реализацию идей изложенных по ссылке.
ПС. По данной задаче 65 итераций цикла.