列表整数,为每个索引查找除该索引之外的每个整数的乘积

时间:2017-06-26 09:41:18

标签: c# linq

您有一个整数列表,并且对于每个索引,您要查找除该索引处的整数之外的每个整数的乘积。

我无法理解我的代码有什么问题:

<ComboBox ItemsSource="{Binding Elements}">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      Content="{Binding Caption}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

6 个答案:

答案 0 :(得分:1)

我认为出现问题的是,您只在程序开始时将结果定义为1 - 据我所知,您希望在第一个for循环中启动它({ {1}})。

找到列表中每个整数的乘积,然后将其除以索引处的整数会不容易?

for (int j = 0; j < 9; j++)

答案 1 :(得分:0)

问题是你在每次迭代后都没有重置POST https://graph.microsoft.com/v1.0/users Authorization: Bearer {token} Content-type: application/json { "accountEnabled": true, "displayName": "displayName-value", "mailNickname": "mailNickname-value", "userPrincipalName": "upn-value@tenant-value.onmicrosoft.com", "passwordProfile" : { "forceChangePasswordNextSignIn": true, "password": "password-value" } } ,所以outcome会变得越来越大。对您的程序的一个简单修复是:

outcome

但是,您可以通过实施此算法来显着提高效率(我不会为您编写鳕鱼,但您可以轻松自己编写鳕鱼)

  1. 计算所有元素的产品(称之为 int removed; List<int> list = new List<int>(new int[] { 1, 2, 6, 4, 6, 4, 9, 8, 3, 1 }); for (int j = 0; j < 9; j++) { removed=list[j] ; list.RemoveAt(j); int outcome = 1; for (int i = 0; i < 9; i++) { outcome *= list[i]; } list.Add(removed); Console.WriteLine(outcome); }
  2. 遍历每个元素,在每个索引product处,打印出值 j

答案 2 :(得分:0)

您必须将for (int i = 0; i < 9; i++)修改为for (int i = 0; i < list.Count; i++)。因为您运行list.RemoveAt(j);,所以计数列表为9;

static void Main(string[] args)
{
    int outcome = 1;
    int removed;
    List<int> list = new List<int>(new int[] { 1, 2, 6, 4, 6, 4, 9, 
8, 3, 1 });
    for (int j = 0; j < 9; j++)
    {
        removed = list[j];
        list.RemoveAt(j);
        for (int i = 0; i < list.Count; i++)
        {
            outcome *= list[i];
        }
        list.Add(removed);
        Console.WriteLine(outcome);
    }
    Console.ReadKey();
}

答案 3 :(得分:0)

您的代码存在一些问题:

  • 您可以更改正在循环的列表
  • 您没有重置结果变量
  • 您不会迭代整个列表(有十个元素,但只能迭代超过9个)

一个工作示例可能是:

for (int j = 0; j < list.Count; j++)
{
    int output = list.Where((val, idx) => idx != j).Aggregate((a, x) => a * x);
    Console.WriteLine(output);
}
Console.ReadKey();

答案 4 :(得分:0)

删除索引处的项目,然后添加到结束列表。 不要修改列表,只需跳过所需的项目。例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestList
{
    class Program
    {
        static void Main(string[] args)
        {
            double outcome = 1;
            List<double> list = new List<double>(new double[] { 1, 2, 6, 4, 6, 4, 9, 8, 3, 1 });
            //List<int> list = new List<int>(new int[] { 1, 2, 3 });
            for (int i = 0; i < list.Count; i++)
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (i == j)
                        continue;
                    outcome *= list[j];
                }
            }
            Console.WriteLine(outcome);
            Console.WriteLine("Press any key to continue . . .");
            Console.ReadKey();
        }
    }
}

P.S。使用double是因为值太高了!

答案 5 :(得分:0)

你有两个问题:

  1. 当您迭代它们时,您正在更改列表中项目的顺序。
  2. 您没有在外部循环中将outcome重置为1,因此它会越来越大。
  3. 您可以考虑采用不同的方法:

    1. 计算列表中所有数字的乘积。
    2. 对于列表中的每个数字,将总产品除以该数字,以得出不包含该数字的产品。
    3. 您应该使用long来保留产品的一般情况,以帮助避免溢出(尽管足够长的列表仍然可以溢出long

      您可以使用Linq&#39; Aggregate计算产品,如下所示:

      List<int> list = new List<int>(new[] {1, 2, 6, 4, 6, 4, 9, 8, 3, 1});
      long prod = list.Aggregate(1L, (p, v) => p * v); // 1L means it will use long.
      

      然后您可以按如下方式计算排除列表中每个元素的产品:

      foreach (var i in list)
          Console.WriteLine(prod / i);
      

      请注意,如果列表中的任何元素为零,则不起作用。在这种情况下,每个最终产品应为零。