如何停止添加C#中出现两次的数字
本文关键字:两次 数字 添加 何停止 | 更新日期: 2023-09-27 18:27:59
所以我正试图找到这个问题的答案:
如果我们列出所有10以下的自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。求出1000以下所有3或5的倍数之和。
我正在使用C#,并且很清楚该怎么做,但我的代码一直在计算出现两次的数字(例如15、30),我想知道最快/最简单的方法来抵消这种情况。到目前为止,我发现的所有东西都是用不同的语言写的,所以如果这对你来说相对容易的话,我很抱歉。这就是我目前所拥有的:
static void Main(string[] args)
{
var result1 = 0;
var result2 = 0;
var result3 = 0;
var uniqueInts3 = new List<int>();
for (var i = 0; i < 1000; i += 3)
{
uniqueInts3.Add(i);
result1 += i;
}
var uniqueInts5 = new List<int>();
for (var o = 0; o < 1000; o += 5)
{
uniqueInts5.Add(o);
result2 += o;
}
result3 += result1 + result2;
Console.WriteLine(result3);
Console.ReadLine();
}
如果有人能向我解释该怎么做,我会很高兴的,因为我现在还不确定。
不是最有效的方法,但应该可以使用
var sum = 0;
for(int i=0;i<1000;i++)
{
if(i%3==0||i%5==0) //checks if something is multiple of 3 or 5
sum+=i; // sums only when it's multiple of 3 or 5
}
它忽略了3和5的倍数的情况。每个数字取一次。
单线线路:
var sum = Enumerable.Range(3, 1000).Sum(x => (x % 3 == 0 || x % 5 == 0) ? x : 0);
最快的数学方法版本:
var result = SumDivisbleBy(3,999)+SumDivisbleBy(5,999)-SumDivisbleBy(15,999);
private int SumDivisbleBy(int n, int p)
{
return n*(p/n)*((p/n)+1)/2;
}
它计算可被3和5整除的所有数字的和,然后减去可被15整除的数字的和。说明:http://www.wikihow.com/Sum-the-Integers-from-1-to-N
var sum = Enumerable.Range(1, 1000)
.Where(i => i % 3 == 0 || i % 5 == 0)
.Sum();
这是我的2美分
版本1,使用for循环。
int sum = 0;
for(int i = 0; i < 10; i++)
if (new[] {3, 5}.Any(n => i % n == 0))
sum += i;
版本2,使用C#Linq
var sum =
Enumerable.Range(1, 10 - 1)
.Where(e => new[] { 3, 5 }.Any(n => e % n == 0))
.Sum();
Enumerable.Range(1, 10 - 1)
创建一个从0到9(小于10)的整数序列。
.Where(..)
是一种对原始序列进行过滤的方法。
CCD_ 3创建另一个仅包含3和5的序列。
.Any(n => e % n == 0)
取3和5,并且对原始序列中的每个数字执行模运算。在结果为0的情况下,Any
方法返回true,这反过来意味着Where
方法在结果中包括数字。
最后是总和。
只是为了提供一种替代方法。。。
首先,我们可以观察到,在以下重复序列中,3和5的倍数之间有间隙:
2, 1, 3, 1, 2, 3, 3
考虑到这一点,我们可以编写一种计算总数的方法:
int sumMultiplesOf3And5UpTo(int n)
{
int i = 3;
int j = 0;
int t = 0;
int[] increments = new []{2, 1, 3, 1, 2, 3, 3};
while (i <= n)
{
t += i;
i += increments[j++%7];
}
return t;
}
对于最终速度,您可以像这样"展开增量数组":
int sumMultiplesOf3And5UpTo(int n)
{
int i = 3;
int t = 0;
while (true)
{
t += i;
i += 2;
if (i > n) break;
t += i;
i += 1;
if (i > n) break;
t += i;
i += 3;
if (i > n) break;
t += i;
i += 1;
if (i > n) break;
t += i;
i += 2;
if (i > n) break;
t += i;
i += 3;
if (i > n) break;
t += i;
i += 3;
if (i > n) break;
}
return t;
}
我永远不会真的这样实施它;这只是一种好奇(也是一种不同方法的例子)。
一种简单的方法是循环从1到1000的所有数字,看看它们是3还是5的乘积,如果是,只需将它们添加到循环外的result
变量中。由于这是一个项目euler问题,我会让你自己计算代码。祝你好运
附言,查看%运算符,它会帮你的。
尝试在WriteLine()之前获得结果
var sum = uniqueInts3.Concat(uniqueInts5).Distinct().Sum()
我玩了一会儿,这就是我的解决方案:
private static int sumMultiples(int max, int small, int big)
{
int sum = 0;
int diff_add = big - small;
int diff = diff_add;
int next = small;
while (next < max)
{
sum += next;
if (next + diff < max
&& (next + diff) % small != 0)
{
sum += next + diff;
}
diff += diff_add;
next += small;
}
return sum;
}
while循环运行最大/最小次数。