C#获取NZEC错误解析HackerEarth上的输入

时间:2018-02-13 19:03:59

标签: c#

我想学习C#所以我开始使用hackerearth并从他们的网站解决问题,但我遇到了某种问题。所以我有以下代码

using System;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            long N, i, answer = 1;
            do
            {
                N = Convert.ToInt32(Console.ReadLine());

            } while (N < 1 && N > 1000);

            long[] A = new long[N];

            for (i = 0; i < N; i++)
            {
                do
                {
                    A[i] = Convert.ToInt32(Console.ReadLine());
                } while (A[i] < 1 && A[i] > 1000);
            }

            for(i = 0; i < N; i++)
            {
                answer = (answer * A[i]) % (1000000007);
            }

            Console.WriteLine(answer);
        }
    }
}

当我编译它时,我得到正确的答案,一切都很好但是当我将它提交给hackerearth编译器时,它给了我NZEC错误。我以为自己错过了一些东西,因为我刚刚开始使用C#,所以我再次写了它,但是在C ++中,它给了我网站上的最高分。我知道我的变量声明中可能存在一些问题,因为我不清楚如何读取数字,我希望你能帮我解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:1)

假设你被困在Find Product problem,正如你所怀疑的那样,数据的输入是N的一行,然后是你需要乘以的所有N个数的一行,由空间。您可以使用LINQ快速解析数字行(我建议您尽快陷入LINQ - 这将使您远离C ++命令式思维模式)。

怎么样:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = Convert.ToInt32(Console.ReadLine()); // Less than 2^31 integers to be read
            var A = Console.ReadLine() // Read the line of space delimited numbers
                .Split(' ') // Split out by the separator
                .Select(n => Convert.ToInt64(n)) // Parse each number to long
                .ToArray(); // Convert to a materialized array

            Debug.Assert(A.Length == N, "Site lied to us about N numbers");

            long answer = 1; // or var answer = 1L;
            for(var i = 0; i < N; i++)
            {
                answer = (answer * A[i]) % (1000000007);
            }

            Console.WriteLine(answer);
        }
    }
}

一些注意事项:

  • do..while无效 - 它们将在一次通过后一直退出 - 这是因为一个值不能&lt; 1和&gt; 1000同时
  • 请注意Convert.ToInt32解析32位int。你定义了一个long(在C#中总是64位,与C ++不同),所以这应该是Convert.ToInt64
  • 然而问题确实将A[i]限制在10 ^ 3以下,因此A[]可以是int [],尽管产品可能更大,因此long甚至System.Numerics.BigInteger可以用于产品。
  • NZEC是一个特定于站点的错误 - 这意味着该应用程序崩溃时出现非零进程的ecit代码。该站点还在页面下方打印实际错误和堆栈跟踪。

由于您说您想学习C#(而不仅仅是将C代码转换为C#),您还可以LINQify最终的for循环,它使用.Aggregate计算数组的答案。 Aggregate支持种子重载(即left fold,因为它允许返回类型不同)和非种子重载(即reduce,其中返回类型必须与输入可枚举相同)。在您的情况下,您实际上不需要使用1L为答案播种,因为它可以使用A[0]播种,而下一个乘法将使用A[1],因为任何数字乘以1将是数字。

var answer = A.Aggregate((subtotal, next) => (subtotal * next) % (1000000007));