我想学习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 ++中,它给了我网站上的最高分。我知道我的变量声明中可能存在一些问题,因为我不清楚如何读取数字,我希望你能帮我解决这个问题。谢谢!
答案 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
可以用于产品。由于您说您想学习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));