2014-12-23 9 views
2

所以我有pow - 一個包含數字的列表。我必須檢查像這樣的其他數字:獲取所有數字並將pow中的數字與具有相同索引的數字相加。基於變量的第n個字符沒有按預期工作

因此,如果我檢查號碼4552我需要得到pow[4]+pow[5]+pow[5]+pow[2]。因爲我是一個noob,我嘗試將數字轉換爲string,使用循環獲取字符,然後轉換回int以獲取索引。因此,代碼是獲得4550和4559之間的金額如下:

 for (int i = 4550; i < 4560; i++) 
     { 
      int sum = 0; 
      for (int j = 0; j < i.ToString().Length; j++) 
      { 
       sum += pows[Convert.ToInt32(i.ToString()[j])]; //here is the error - index was out of range 
       //do something with sum (like store it in another list) 
      } 
     } 

那麼,什麼是錯?

編輯:爲了避免混淆... pow有10個元素,從索引0-9。

SOLUTION:我的代碼的問題是,我得到的字符代碼不是數字本身,感謝史蒂夫萊麗斯。雖然Dmitry Bychenko提供的解決方案遠遠勝於我的嘗試。謝謝你們。

回答

4

你在找什麼是類似於digital root

模量(%在C#)是更容易和比轉換更快串

public static int DigitalRootIndex(IList<int> list, int value) { 
    if (value < 0) 
    value = -value; 

    int result = 0; 

    // for value == 4552 
    // result == list[4] + list[5] + list[5] + list[2] 
    while (value > 0) { 
    int index = value % 10; 
    result += list[index]; 
    value /= 10; 
    } 

    return result; 
} 

... 

int test = DigitalRootIndex(pow, 4552); 
1

的碼,該位得到一個單一的字符如「4」,這是字符代碼59:

c = i.ToString()[j] 

然後這個代碼位變爲該焦炭引入一個整數。像你期待它不解析它,所以對於「4」的結果是59,不是4:

Convert.ToInt32(c) 

而是執行此操作:

int.Parse(c.ToString()) 
+0

哇,這很奇怪。它嘗試了'sum + = ...'後再次死於同樣的錯誤,但我把一個'console.writeline(x);'並得到49(?!) – fishmong3r

+1

更新我的答案,因爲我剛剛意識到發生了什麼:) –

-1

這樣的事情(快速和骯髒的嘗試)?

 int currentDigit; 
     int sum; 
     for (int i = 4550; i < 4560; i++) 
     { 
      sum = 0; 
      currentDigit = i; 
      while (currentDigit > 0) 
      { 
       if (pow.Count > (currentDigit % 10)) 
       { 
        sum += pow[((currentDigit % 10))]; 
       } 
      } 
     } 

注意,名單有從零開始的索引,所以當你POW [1],實際上您訪問列表中的第二個元素。那是你要的嗎?