2015-06-03 1 views
-1

Я ищу функцию (с целым/математическим оператором вместо строки), которая определяла бы, будет ли входной номер начинаться с 31 и заканчиваться на 21.Найдите числа, начинающиеся с 31 и заканчивающиеся на 21 на заданный интервал

Например, если массив целых чисел ниже:

{341521, 513135, 434632, 312321, 315364, 312421}

функция должна возвращать 312321 и 312421.

Я до сих пор нет он завершился, но вот что я до сих пор (C#):

public bool IsValidId(int input) 
{ 
    var result = input >= 310000 && input < 320000; 

    if (result) 
    { 
     // Check for anything ending with 21, maybe something like 
     // var endWith = (double) ((input/21)/100); 
     // then check if endWith has decimal.. 
    } 

    return result; 
} 
+1

Покажите нам, какой код вы написали. Какие тесты не удается? – rossum

+0

Я бы предположил, что ни одна библиотека не имеет этого конкретного метода, почему бы вам не написать его? –

+0

Вопрос звучит так, как будто ему нужна пользовательская математическая функция. Я рекомендую просить его на [Math Exchange] (http://math.stackexchange.com) –

ответ

2

Это может быть достигнуто довольно просто с помощью строки с помощью startsWith и endsWith, но если вы не хотите использовать строки на все, что вы можете держать найти цифру числа, используя Math.log10 и Math.pow функции. Я попытался бы объяснить использование этих функций, но моя номенклатура математики настолько ржавая, что я уверен, что я потерплю ужас. Я прокомментировал код, чтобы объяснить использование переменных.

public static void main(String [] args) { 
    int [] checks = new int[] { 341521, 513135, 434632, 312321, 315364, 312421 }; 
    for(int check : checks) { 
     System.out.println(check + " " + startsWithEndsWith(check, 31, 21)); 
    } 
} 

public static boolean startsWithEndsWith(int value, int startWithNumber, int endsWIthNumber) { 
    // get the number of digits for each of our inputs 
    int numValueDigits = (int) Math.log10(value); 
    int numStartsDigits = (int) Math.log10(startWithNumber); 
    int numEndsDigits = (int) Math.log10(endsWIthNumber); 

    // if the value doesnt have as many digits as either our starting or ending numbers then its impossible to be true 
    if(numValueDigits < numStartsDigits || numValueDigits < numEndsDigits) { 
     return false; 
    } 

    // for each of our startWithNumber digits check if the number in the value matches the corrisponding number in the startsWithNumber 
    for(int i=0;i<=numStartsDigits;i++) { 
     if(getDigitAt(value, numValueDigits-i) != getDigitAt(startWithNumber, numStartsDigits-i)) { 
      return false; 
     } 
    } 

    // for each of our endsWithNumber digits check if the number in the value matches the corrisponding number in the endsWithNumber 
    for(int i=0;i<=numEndsDigits;i++) { 
     if(getDigitAt(value, i) != getDigitAt(endsWIthNumber, i)) { 
      return false; 
     } 
    } 

    // nothing failed therefore its valid 
    return true; 
} 

/** 
* returns the digit at the specified location, starting at 0 would be the 1's place. Returns 0 if the location is higher than the number 
* @param num 
* @param location 0<=location<=9 
* @return 
*/ 
private static int getDigitAt(int num, int location) { 
    // divide our number by 10^location to make the digit at the location 
    // be in the 1's position, then modulus that by 10 to extract the digit 
    return (int) (num/Math.pow(10, location)) % 10; 
} 
1

Вы можете получить п-ю цифру числа путем деления его остаток с 10^п на 10^(п-1) и взять целую часть (~ Math.Floor).

int((3123 % 10^4)/10^3) = 3 
int((3123 % 10^3)/10^2) = 1 
int((3123 % 10^2)/10^1) = 2 
int((3123 % 10^1)/10^0) = 3 
0

петля Просто для всех номеров, каждый из них использует O (1), чтобы проверить, если они удовлетворяют условиям: Пусть С текущее число

  1. C% 100 == 21
  2. Пусть d = пол (журнал (С) + 1), если (d-2> = 0 & & С/10^(д-2) == 31)

Если С удовлетворяет обоим условиям, то является одним из номеров 31 * 21

Конечно, почему бы просто не использовать строку для проверки C [0,1] == "31" & & C [len-2, len-1] == "21"?