作为一名学生,我该如何改善不良代码?

时间:2018-12-07 20:42:38

标签: c++ optimization

如何改进此意大利面条代码?我是学生,这是我第一门编程课程很慢。

我想实现的目标

找到一个交替的总数,直到一个数字。

问题概述

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。

代码

我尝试将偶数和奇数存储在不同的数组中,然后取每个数字的和并减去。

怎么了?

我的代码似乎适用于少量数字,因为某些测试用例超出了我认为我的代码可以处理的范围。

我尝试过的事情

我尝试使用数组的大小,但没有得到我想要的。

我应该放弃此代码,然后尝试其他方法吗?如果没有,我该如何解决这种可恶并指导我进行操作?

1 个答案:

答案 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。