2016-11-28 63 views
1

我的foreach循環太多次了,我不明白爲什麼。該方案應該低谷1-100,並總結每個數字的四次方。List <>太多循環

using System; 
using System.Collections.Generic;  

public class Program 
{ 
    public static void Main() 
    { 
     int sum = 0;    
     string temp = "";   
     List<int> digits = new List<int>(); 

     for (long i = 2; i < 100; i++) 
     { 
      temp = i.ToString(); 

      for(int y = 0; y < temp.Length; y++) 
      { 
       digits.Add(Convert.ToInt32(temp.Substring(y,1))); 

       foreach(int j in digits) 
       { 
        sum += Convert.ToInt32(Math.Pow(j,4));      
        Console.WriteLine("foreach loop: i = {0}, y = {1}, sum = {2}, j = {3}, digits count = {4}",i,y,sum,j,digits.Count); 
       }     
      } 

      Console.WriteLine("i = {0}, sum = {1}", i, sum);     
      sum = 0;      
      digits.Clear(); 
     } 
    } 
} 

下面是輸出例如

foreach loop: i = 10, y = 0, sum = 1, j = 1, digits count = 1 
foreach loop: i = 10, y = 1, sum = 2, j = 1, digits count = 2 
foreach loop: i = 10, y = 1, sum = 2, j = 0, digits count = 2 
i = 10, sum = 2 
foreach loop: i = 11, y = 0, sum = 1, j = 1, digits count = 1 
foreach loop: i = 11, y = 1, sum = 2, j = 1, digits count = 2 
foreach loop: i = 11, y = 1, sum = 3, j = 1, digits count = 2 
i = 11, sum = 3 
foreach loop: i = 12, y = 0, sum = 1, j = 1, digits count = 1 
foreach loop: i = 12, y = 1, sum = 2, j = 1, digits count = 2 
foreach loop: i = 12, y = 1, sum = 18, j = 2, digits count = 2 
i = 12, sum = 18 

爲什麼foreach循環上的2位的數字3次?在迴路後清除數字列表

讓我們以10爲例。

temp = "10"; 
temp.Length = 2; 
second for loop (y) runs twice. 1 < 2 
digits gets filled twice 
foreach runs three times 
+0

然後好像你所有環路位數每個數字在列表中。兩個數字=加一個數字時一個循環,然後再加兩個數字時循環兩次,因爲列表中包含兩個數字 – Fabio

+0

這是因爲你有一個超過數字的循環for(int y = 0; y juharr

+2

您需要在第二個'for'循環之外移動'foreach'循環。 – Fabio

回答

2

你的foreach循環似乎創建額外的循環。每次添加下一位數字時,它會循環列表中的所有數字。

這裏你甚至不需要foreach循環和數字列表。

public static void Main() 
{ 
    int sum = 0; 
    string temp = ""; 

    for (long i = 2; i < 100; i++) 
    { 
     temp = i.ToString(); 
     for(int y = 0; y < temp.Length; y++) 
     { 
      int digit = Convert.ToInt32(temp.Substring(y,1)); 
      sum += Math.Pow(digit,4); 
     } 
     Console.WriteLine("i = {0}, sum = {1}", i, sum); 
     sum = 0; 
    } 
} 
我不喜歡使用處理整數字符串

,下面是解決方案,而字符串和整數之間的轉換

public static void Main() 
{ 
    int sum = 0; 
    for (long i = 2; i < 100; i++) 
    { 
     for(int temp = i; temp > 0; temp /= 10) 
     { 
      int digit = temp % 10; 
      sum += Math.Pow(digit,4); 
     } 
     Console.WriteLine("i = {0}, sum = {1}", i, sum); 
     sum = 0; 
    } 
} 
+0

從後面開始,使用模數,聰明。漂亮而緊湊。謝謝 – Unfrieden

2

讓我們把它從頭與適當名(什麼是ij重新寫?)和評論:

public static void Main() { 
    // we should scan numbers from 2 to 100 
    for (int number = 2; number < 100; ++number) { 
    string value = number.ToString(); 

    // digits: just the length of the string: "789" -> 3, "45" -> 2, "7" -> 1 
    int digits = value.Length; 

    // let's sum up the digits 
    int sum = 0; 

    // as we promised: sum up all 4th powers of the digits 
    foreach (char c in value) { 
     int digit = c - '0'; // notice, that c is character and we want int 

     sum += Math.Pow(digit, 4); 
    } 

    // time to output: 
    Console.WriteLine("{0, 2}, sum = {1, 5}, digits count = {2, 1}", 
     number, sum, digits); 
    } 
} 

Linq解決方案,它是更靈活

int startFrom = 2; 
int endAt = 100; 

var result = Enumerable 
    .Range(startFrom, endAt - startFrom) 
    .Select(number => new { 
    number = number, 
    digits = number.ToString().Length, 
    sum = number 
     .ToString()  
     .Select(c => c - '0') 
     .Sum(x => Math.Pow(x, 4)) }) 
    .Select(item => $"{item.number, 2}, sum = {item.sum, 5}, digits = {item.digits, 1}"); 

Console.Write(string.Join(Environment.NewLine, result)); 

輸出:

2, sum = 16, digits count = 1 
3, sum = 81, digits count = 1 
4, sum = 256, digits count = 1 
5, sum = 625, digits count = 1 
6, sum = 1296, digits count = 1 
7, sum = 2401, digits count = 1 
8, sum = 4096, digits count = 1 
9, sum = 6561, digits count = 1 
10, sum =  1, digits count = 2 
... 
98, sum = 10657, digits count = 2 
99, sum = 13122, digits count = 2 
+0

謝謝 - 在使用整數循環時,我總是忘記了'Enumerable.Range' :) – Fabio

0

另一個(部分)Linq基礎的解決方案:

public static void Main() 
{ 
    for (long i = 2; i < 100; i++) 
    { 
     int sum = 0; 
     foreach (var digit in i.ToString().Select(digit => int.Parse(digit.ToString()))) 
     { 
      sum += Convert.ToInt32(Math.Pow(Convert.ToInt32(digit), 4)); 
     } 
     Console.WriteLine("i = {0}, sum = {1}", i, sum); 
    } 
}