您有一个整数列表,并且对于每个索引,您要查找除该索引处的整数之外的每个整数的乘积。
我无法理解我的代码有什么问题:
<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>
答案 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
但是,您可以通过实施此算法来显着提高效率(我不会为您编写鳕鱼,但您可以轻松自己编写鳕鱼)
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);
}
)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)
您的代码存在一些问题:
一个工作示例可能是:
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)
你有两个问题:
outcome
重置为1,因此它会越来越大。您可以考虑采用不同的方法:
您应该使用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);
请注意,如果列表中的任何元素为零,则不起作用。在这种情况下,每个最终产品应为零。