2016-11-28 60 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); 
    } 
}