动态写入列表

本文关键字:列表 动态 | 更新日期: 2023-09-27 17:55:51

所以我正在尝试解决这个问题:

你会得到一个数字 n 和 2*n 个数字。编写要检查的程序 奇数之和是否等于偶数n之和 数字。第一个数字被认为是奇数,下一个是偶数,下一个是偶数 又奇怪了,等等。打印结果为"是"或"否"。如果是,请打印 也是总和。如果否,则还要打印奇数之间的差异 和偶数总和。

输入

应从控制台读取输入数据。

• 第一行包含整数 n – 数字计数。

• 接下来的 2*n 行中的每一行都只包含一个数字。

输入数据将始终有效,并且采用所描述的格式。那里 无需明确检查。

输出

• 输出必须打印在控制台上。

• 打印"是的,sum=S",其中 S 是奇数 n 个数字的总和,以防万一 奇数 n 数之和等于偶数 n 之和 数字。

• 否则打印"否,diff=D",其中 D 是 奇数 n 数和偶数 n 数之和。D 应 始终为正数。约束

• 数字 n 在 [0...500] 范围内是整数。

• 所有其他数字都是 [-500 000 ...500 000]。

• 程序允许的工作时间:0.25 秒。

• 允许内存:16 MB。

我当前的编译代码是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Odd_and_Even_Sum
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            List<string> stringOfNumbers = new List<string>(2*n);
            stringOfNumbers.DefaultIfEmpty();
            List<int> listOfEvenNumbers = new List<int>(2*n);
            List<int> listOfOddNumbers = new List<int>(2*n);
            int diff = 0;
            for (int i = 0; i < 2*n; i++)
            {
                stringOfNumbers[i] = Console.ReadLine();
            }
            List<int> listOfNumber = new List<int>() { 1, 2, 3 };
            for (int i = 0; i < 2*n; i++)
            {
                listOfNumber[i] = int.Parse(stringOfNumbers[i]);
            }
            foreach (var item in listOfNumber)
            {
                if (IsEven(item))
                {
                    listOfEvenNumbers.Add(item);
                }
                else
                {
                    listOfOddNumbers.Add(item);
                }
            }
            int sumOfEven = listOfEvenNumbers.Sum();
            int sumOfOdd = listOfOddNumbers.Sum();
            if (sumOfEven > sumOfOdd){
                diff = sumOfEven - sumOfOdd;
            }
            if (sumOfEven < sumOfOdd){
                diff = sumOfOdd - sumOfEven;
            }
            if (sumOfEven == sumOfOdd)
            {
                Console.WriteLine("Yes, sum ={0}", sumOfEven);
            }
            else
            {
                Console.WriteLine("No, diff={0}", diff);
            }
        }
        public static bool IsEven(int n)
        {
            if (n % 2 == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

我的代码正在编译,但是当我插入输入值时,我得到这个错误:

未处理的异常:System.ArgumentOutOfRangeException:索引已出 的范围。 必须是非负数且小于 收集。参数名称:索引位于 System.ThrowHelper.ThrowArgumentOutOfRangeException() at System.Collections.Generic.List'1.set_Item(Int32 index, T 值) at Odd_and_Even_Sum.Program.Main(String[] args) in c:''Users''User1''Documents''V isual Studio 2013''Projects''Odd and even 总和''程序.cs:第 21 行

动态写入列表

当你

写的时候

List<string> stringOfNumbers = new List<string>(2*n);

您正在创建一个新的列表,该列表具有零元素,但初始容量限制为 2*n。这意味着它保留内存用于插入 2*n 个元素,但它没有任何内存

stringOfNumbers[i] = Console.ReadLine();

在这里,您正在尝试访问列表中导致异常的元素,因为列表中没有元素。

stringOfNumbers.Add(Console.ReadLine());

您混淆了添加动态列表元素的方式,并且在此列表的实例中存在错误