2013-12-17 94 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添加到列表中。保持一致 - 每個人都有倍數乘數單位,並保持這種方式到最後。當你這樣做時,你會發現製作循環更容易。或者更好的是,根本不要列出這些單位。必要時使用0,然後使用一些模算術。 –

+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 
相關問題