2013-12-17 3 views
1

Я пытаюсь сделать что-то:Какой лучший подход сделать это в C#?

Input <= 3432 

    Output => List contains 7 items i.e. (3, 1000, 4, 100, 3, 10, 2) 

Для этого я написать функцию в C#:

public BigInterger FromDecimal() 
{ 
    List<BigInteger> numbers = new List<BigInteger>(); 

    BigInteger number = BigInteger.Parse(NumberString); 

    while (number > 0) 
    { 
     if (number >= 1000000000) 
     { 
      numbers.Add(number/1000000000); 
      number = number % 1000000000; 
      numbers.Add(1000000000); 
     } 
     else if (number >= 100000000) 
     { 
      numbers.Add(number/100000000); 
      number = number % 100000000; 
      numbers.Add(100000000); 
     } 
     else if (number >= 10000000) 
     { 
      numbers.Add(number/10000000); 
      number = number % 10000000; 
      numbers.Add(10000000); 
     } 
     else if (number >= 1000000) 
     { 
      numbers.Add(number/1000000); 
      number = number % 1000000; 
      numbers.Add(1000000); 
     } 
     else if (number >= 100000) 
     { 
      numbers.Add(number/100000); 
      number = number % 100000; 
      numbers.Add(100000); 
     } 
     else if (number >= 10000) 
     { 
      numbers.Add(number/10000); 
      number = number % 10000; 
      numbers.Add(10000); 
     } 
     else if (number >= 1000) 
     { 
      numbers.Add(number/1000); 
      number = number % 1000; 
      numbers.Add(1000); 
     } 
     else if (number >= 100) 
     { 
      numbers.Add(number/100); 
      number = number % 100; 
      numbers.Add(100); 
     } 
     else if (number >= 10) 
     { 
      numbers.Add(number/10); 
      number = number % 10; 
      numbers.Add(10); 
     } 
     else 
     { 
      numbers.Add(number); 
      number = 0; 
     } 
    } 

    return numbers; 
} 

Теперь я чувствую, что этот код слишком большой, так есть ли лучший подход для достижения это ?

+1

Один лучший подход, который сразу же переходит на ум, чтобы добавить 1 в свой список. Будьте последовательны - у вас есть умножитель единиц пар пар для каждого, держите его таким образом до конца. Когда вы это сделаете, вам будет проще сделать цикл. Или даже лучше, не перечисляйте единицы вообще. При необходимости используйте 0s, а затем просто используйте некоторую арифметику по модулю. –

+0

Лучшим способом является ** Рекурсия ** – Shaharyar

+6

Этот вопрос не соответствует теме, потому что речь идет о коде, который работает как есть, без ошибок. Для критики или предложений по улучшению вашего кода, пожалуйста, спросите на http://codereview.stackexchange.com/ –

ответ

2

Создайте таблицу величин десяти или вычислите их, как вы идете. Это позволит вам разделить число на пары цифр и их значения места, используя обычный цикл, в отличие от использования развернутого цикла, который поднимается до фиксированного числа.

Вот один из способов вы можете сделать это:

var ten = new BigInteger(10); 
var res = new List<BigInteger>(); 
var number = BigInteger.Parse(NumberString); 
int pow = 0; 
while (!BigInteger.Zero.Equals(number)) { 
    var lastDigit = BigInteger.Remainder(number, ten); 
    var placeValue = BigInteger.Pow(ten, pow++); 
    res.Add(placeValue); 
    res.Add(lastDigit); 
    number = BigInteger.Divide(number, ten); 
} 
+0

спасибо за ответ, можете ли вы, пожалуйста, дать мне образец кода для этого? – user1740381

+0

@ user1740381 Это должно работать - я не пробовал, но он должен быть достаточно простым, чтобы сделать трюк. Обратите внимание, что этот код выводит результат в обратном порядке и добавляет '1' для значения места последней цифры. – dasblinkenlight

0
public List<int> ParseIntoList(string initialNumber, List<int> currentArray) 
{ 
    if (initialNumber.Length == 0){ 
     return currentArray; 
    } 

    var digit = initialNumber[0]; 
    initialNumber = initialNumber.Substring(1); 
    var power = Math.Pow(10, initialNumber.Length); 
    currentArray.Add(digit); 
    currentArray.Add(power); 
    return ParseIntoList(initialNumber, currentArray); 
} 

Называйте это следующим способом: ParseIntoList("3432", new List <int>()). Вы можете обернуть его в вызове или сделать itterative версию алгоритма

0

Вы можете просто работать на струнах:

static void Main(string[] args) 
{ 
    var input = "3432"; 
    var result = Foo(input); 
} 

private static string[] Foo(string input) 
{ 
    var output = new List<string>(); 
    var power = input.Length; 

    for (int i = 0; i < input.Length; i++) 
    { 
     output.Add(input[i].ToString()); 
     if (i < input.Length-1) 
      output.Add(Math.Pow(10, power).ToString()); 

     power--; 
    } 

    return output.ToArray(); 
} 
+0

Снова перевернуто? Кажется ненужным –

+0

@YuriiHohan вы правы, вот как я думал о проблеме. Я обновил свой ответ. – BryanJ

0

LINQ на e вкладышей для спасения!

string inputString = "3432"; 
var result = Enumerable.Range(0, inputString.Length) 
        .SelectMany(
          i => new[] 
           { 
            Convert.ToInt32(inputString[i] - '0'), 
            (int) Math.Pow(10, inputString.Length - i - 1) 
           }, (i, g) => g).ToList(); 
0
static IEnumerable<long> GetDigitsAndMultiplesOfTen(long value) 
    { 
     var powerOfTen = (long)Math.Ceiling(Math.Log10(value)); 
     var divisor = (long)Math.Pow(10, powerOfTen); 

     while (divisor > 0) 
     { 
      var quotient = value/divisor; 

      if (quotient > 0) 
      { 
       yield return quotient; 

       if (divisor > 1) 
        yield return divisor; 
      } 

      value %= divisor; 
      divisor /= 10; 
     } 
    } 

код программы:

 long value = 3432; 

     var list = GetDigitsAndMultiplesOfTen(value).ToList(); 

     foreach (var item in list) 
      Console.WriteLine(item); 

Выход:

3 
1000 
4 
100 
3 
10 
2 
Смежные вопросы