метод, который возвращает цифру по индексу - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу написать метод, который возвращает цифру числа (num) по индексу (place), в то время как не использует массив только циклы и условия.

Например:

  1. Для ввода num = 17489, place = 1 метод возвращает 9
  2. Но если индекс не существует в подобных num = 17489, place = 6 return -1

что-то в моем коде не работает , если я установил i = 0случай 1) работа, но 2) нет, если я установил i = 1 случай 2) работа, но 1) нет, пожалуйста, помогите понять, что случилось

    public static int Digit_by_place(int num, int place)
    {
        int digit = 0, i = 0;

        // the lop run until the place in the 
        while (num > 0 && i <= place)number
        {
            digit = num % 10;
            num = num / 10;
            i++;

            // if there is no didgit in the input place return -1
            if (i < place && num == 0)
            {
                return -1;
            }

            // return the last digit from left (the bigest)
            if (num == 0 && digit > 0 && i == place)
            {
                return digit;
            }
        }

        return digit;
    }

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018
for(int i=0; i<place; i++)
{
       num = num / 10;
       if (num <= 0)
           return -1;
}
return num % 10;

это должно работать, если вы начинаете считать с 0

0 голосов
/ 21 декабря 2018

Использование только математики.

public int GetNumber(int number, int position)
{
    if(number == 0 && position == 1) 
       return 0;
    if(position <= 0 || position > (int)(Math.Log10(number = Math.Abs(number)) + 1)) 
       return -1;
    return (int)((number % (Math.Pow(10, position))) / (Math.Pow(10, position - 1)));
}
0 голосов
/ 21 декабря 2018

Мы можем использовать тот факт, что int может содержать не более 10 цифр.

Код:

public static int Digit_by_place(int num, int place) {
  if (place <= 0 || place > 10)   // place must be in [1..10] range
    return -1;
  else if (num == 0)              // special case num == 0
    return place == 1 ? 0 : -1;

  for (int i = 1; i < place; ++i)  
    num /= 10;

  return num == 0 ? -1 : Math.Abs(num % 10);
}

Демонстрация:

using System.Linq;
...

Tuple<int, int>[] tests = new Tuple<int, int>[] {
  Tuple.Create( 17489,  1),
  Tuple.Create( 17489,  2),
  Tuple.Create( 17489,  3),
  Tuple.Create( 17489,  4),
  Tuple.Create( 17489,  5),
  Tuple.Create( 17489,  6),
  Tuple.Create(-17489,  1),
  Tuple.Create(-17489,  6),
  Tuple.Create( 17489,  0),
  Tuple.Create( 17489, -1),
  Tuple.Create(-17489, -1),
  Tuple.Create( 17489,  5),
  Tuple.Create(-17489,  5),
  Tuple.Create(     0,  1),
  Tuple.Create(     0,  4),
};

var report = string.Join(Environment.NewLine, tests
  .Select(test => 
     $"Digit_by_place({test.Item1,6}, {test.Item2,2}) = {Digit_by_place(test.Item1, test.Item2),2}"));

Console.Write(report);

Результат:

Digit_by_place( 17489,  1) =  9
Digit_by_place( 17489,  2) =  8
Digit_by_place( 17489,  3) =  4
Digit_by_place( 17489,  4) =  7
Digit_by_place( 17489,  5) =  1
Digit_by_place( 17489,  6) = -1
Digit_by_place(-17489,  1) =  9
Digit_by_place(-17489,  6) = -1
Digit_by_place( 17489,  0) = -1
Digit_by_place( 17489, -1) = -1
Digit_by_place(-17489, -1) = -1
Digit_by_place( 17489,  5) =  1
Digit_by_place(-17489,  5) =  1
Digit_by_place(     0,  1) =  0
Digit_by_place(     0,  4) = -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...