为啥我的答案在hackerearth练习问题中只被部分接受
Posted
技术标签:
【中文标题】为啥我的答案在hackerearth练习问题中只被部分接受【英文标题】:why my answer is only partially accepted in a hackerearth practice problem为什么我的答案在hackerearth练习问题中只被部分接受 【发布时间】:2021-06-07 14:52:44 【问题描述】:问题: 为您提供一个大小为 N 的数组 A,其中包含非负整数。你的任务是确定通过选择所有 N 个数字的最后一位所组成的数字是否可以被 10 整除。
注意:查看示例说明部分以获得更多说明。
输入格式
第一行:一个整数 N,表示数组 Ai 的大小。 第二行:N 个空格分隔的整数。 输出格式:
如果数字可以被 10 整除,则打印 Yes 。否则,打印编号。
约束: 1 0
我已经使用int
、long int
、long long int
以及声明 N 和 'm'。但答案再次被部分接受。
#include <stdio.h>
int main()
long long int N,m,i;
scanf("%ld", &N);
long data[N];
for(auto i=0; i<N; i++)
scanf("%ld", &data[i]);
// write your code here
// ans =
m=(data[0]%10);
for(i=1; i<N; i++)
m=m*10;
m=(data[i]%10)+m;
if(m%10!=0 && m==0)
printf("Yes");
else
printf("No");
return 0;
【问题讨论】:
将auto i
更改为i
,或者可能是int i
。你可能永远不需要使用auto
,在这里肯定没有意义。
可能你需要在'选择所有N个数字的最后一个数字'中发现动词formed
的确切含义...... ?
@AMRITHA S 显示一个数组示例以及如何处理它以获得结果。这句话“选择所有N个数字的最后一位形成的数字”是什么意思?
这是一个奇怪的问题。您需要做的就是查看最后一个数字。如果它以零结尾,则答案是肯定的。否则答案是否定的。
如果 n > 10,您的数字将溢出,因此无法正确测试是否可被 10 整除。正如其他人所指出的,诀窍在于测试最后一个数字是否可被 10 整除就足够了10. 你甚至不需要数组。
【参考方案1】:
尝试制作一个测试套件,即您知道答案的几个测试。在每个测试上运行你的程序;将结果与正确答案进行比较。
在进行测试时,也要尝试解决极端情况。我所说的极端案例是什么意思?你的问题陈述中有它们:
1<=N<=100000
0<=A[i]<=100000
您应该至少进行一项测试,最小和最大N
- 您应该测试您的程序是否适用于这些极端情况。
您还应该进行至少一项测试,最小和最大A[i]
。
由于它们中的每一个都可能不同,因此请尝试改变它们 - 确保您的程序适用于 A[i]
一些较大而一些较小的情况。
对于每个类别,包括答案为 Yes
和 No
的测试 - 以排除算法始终输出的情况,例如Yes
搞错了。
一般来说,您应该尝试进行挑战您的程序的测试 - 尝试证明它有错误,即使您认为它是正确的。
【讨论】:
+1 非常好的评论。创建测试使我们能够识别代码的所有可能的弱点,因为这正是我们试图通过测试发现的。发现弱点需要确定所有要求和限制,包括显式(在任务中给出)和隐式(由所选语言、特定编译器或执行环境强加——例如,int
类型的范围或可用内存的最大大小) )。【参考方案2】:
这段代码溢出:
m=(data[0]%10);
for(i=1; i<N; i++)
m=m*10;
m=(data[i]%10)+m;
例如,当N
为1000,并且每个输入项A[i]
(扫描到data[i]
)以9结尾时,这会尝试计算m
= 99999…99999,这严重溢出了能力long long m
.
要确定由一个数字序列组成的数字是否可以被十整除,您只需要知道最后一个数字是否为零。如果data[N-1] % 10 == 0
,该数字可以被十整除。您甚至不需要将这些数字存储在数组中;只需使用scanf
读取但忽略N
−1 数字(例如、scanf("%*d")
),然后读取最后一个并检查其最后一个数字。
另外scanf("%ld", &N);
错误地将%ld
用于long long int N
。应该是%lld
,或者N
应该是long int
。
【讨论】:
【参考方案3】:当且仅当它的最低有效位为零时,以十进制给出的整数可以被十整除。
如果这个表达式来自你的问题:
选择所有 N 个数字的最后一位数字组成的数字
意思是:
一个数字,其十进制表示来自连接所有输入数字的最低有效位
那么您的号码的最后一位(最低有效位)是最后一个输入号码的最后一位。而那个数字为零就相当于最后一个数字可以被 10 整除。
所以你需要做的就是读取并忽略除最后一个数字之外的所有输入数据,然后测试最后一个数字是否可被 10 整除:
#include <stdio.h>
int main()
long N, i, data;
scanf("%ld", &N);
for(i=0; i<N; i++)
scanf("%ld", &data); // scan all input data
// the last input number remains in data
if(data % 10 == 0) // test the last number
printf("Yes");
else
printf("No");
return 0;
【讨论】:
以上是关于为啥我的答案在hackerearth练习问题中只被部分接受的主要内容,如果未能解决你的问题,请参考以下文章
代码在我的计算机上运行良好,但在“hackerearth”平台上在线运行时出现 NullPointerException