列出大整数范围内的奇数

时间:2017-10-04 12:08:01

标签: c#

我是c#的新手。我有一个Windows窗体程序,可以显示从1到n的奇数。 这是源代码:

                    List<int> t = Enumerable.Range(1, 123456).ToList();
                    var oddNumbers = t.Where(num => num % 2 != 0);
                    txtHasil.Text += oddNumbers.Sum() + Environment.NewLine;
                    txtHasil.Text += string.Join(",", oddNumbers.Select(n => n.ToString()).ToArray()) + Environment.NewLine;
                    txtHasil.Text += oddNumbers.Count() + Environment.NewLine;

如果我在范围内使用1234,程序运行良好。如果我在范围内使用12345,程序仍然可以正常工作。但是如果我在范围内使用123456,则程序错误“算术运算导致溢出” oddNumbers.Sum()行

我该如何处理123456数据?

2 个答案:

答案 0 :(得分:3)

您可以使用较大的类型,例如LongDecimal

List<long> t = Enumerable.Range(1, 123456).Select(i => (long)i).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
long sum = oddNumbers.Sum();

如果您想支持任意尺寸,可以使用System.Numerics.BigInteger

List<BigInteger> t = Enumerable.Range(1, 123456).Select(i => new BigInteger(i)).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
BigInteger sum = oddNumbers.Aggregate(new BigInteger(0), BigInteger.Add);

答案 1 :(得分:3)

这一行

oddNumbers.Sum()

将返回一个整数。您的总和超过了整数最大值的限制。

您可以使用Int64,为您提供更大的容量。

List<Int64> t = Enumerable.Range(1, 123456).Select(i => (Int64)i).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
decimal sum = oddNumbers.Sum();