如何改进此意大利面条代码?我是学生,这是我第一门编程课程很慢。
我想实现的目标
找到一个交替的总数,直到一个数字。
问题概述
https://www.hackerrank.com/contests/cs102-s18-march31/challenges/treasure-road
这是老师提供的档案中的问题。我推论出必须计算出一个交替的总和,其中必须从第一个个偶数的总和中减去第一个个奇数的总和(当然,到#ofsteps / 2)。
我做什么
:- use_module(library(clpfd)).
graph(_, S, S, [S], 0).
graph(Rel, S, T, [S|Rest], N) :-
N #> 0,
call(Rel, S, X),
N1 #= N-1,
graph(Rel, X, T, Rest, N1).
我的逻辑/理由
Zingo只能移动Steps / 2,如果他向前移动一个奇数步,而Ringo则向Zingo靠近一步,否则,如果Zingo将偶数步距Ringo移离Zingo。
假设有10个步骤... 10/5 = 5 ... 5个步骤= 1 + 2 + 3 + 4 + 5,奇数步= 1,3,5;偶数步= 2,4;因此位移为1 + 3-(2 + 4)=-2。
代码
我尝试将偶数和奇数存储在不同的数组中,然后取每个数字的和并减去。
怎么了?
我的代码似乎适用于少量数字,因为某些测试用例超出了我认为我的代码可以处理的范围。
我尝试过的事情
我尝试使用数组的大小,但没有得到我想要的。
我应该放弃此代码,然后尝试其他方法吗?如果没有,我该如何解决这种可恶并指导我进行操作?
答案 0 :(得分:1)
您可以使用总和来代替数组:
sum_evens = 0;
sum_odds = 0;
for (int i = 0; i < steps; ++i)
{
if (i & 1)
{
sum_odds += i;
}
else
{
sum_evens += i;
}
}
编辑1:
前N
个奇数的总和为N*N
。
您可以将计算结果更改为:
sum_odds = steps * steps;
我将第一个N
个偶数的计算留给阅读器/ OP。