【问题标题】:How to improve the execution time of this program?如何提高这个程序的执行时间?
【发布时间】:2015-02-14 20:47:25
【问题描述】:

我想找到从源到目的地的最低跳数。我的输出是正确的,但是当给定 100000 个条目时,我的程序的执行时间就像 1.0015 秒。但我需要在 1 秒的时间内完成该程序。我已经尝试了很多来减少执行时间,但不能。任何人都可以帮助我在 1 秒内实现执行时间。

样本输入 - 1 10 2

样本输出 - 5

P.S- 该程序是远程执行的。输入的数量可以是

#include<stdio.h>
int main()
{
    unsigned int n, i, j, k, h,count=0,l=0;
    scanf("%u", &n);
    for (i=0;i<n;i++)
    {
        scanf("%u %u %u", &j, &k, &h);
        l=j;
        count = 0;
        while(l<=k)
        {
          if(l%h==0)
          {
            count=count+1;
          }
          l++;
        }
        printf("%u\n", count);
    }
    return 0;
}

【问题讨论】:

  • Code Review 会更好吗?
  • 这段代码的意图是什么?
  • 答案不就是 (k-j+h-1)/h 吗?
  • @ArindrajitChakraborty:嗯,不完全是 5,因为 5 次 2 的跳跃会带你到 11。
  • @PeterdeRivaz:是的,从j慢慢迭代到k,每一步都取模可能是解决这个问题的最慢方法。

标签: c performance algorithm math runtime


【解决方案1】:

您可以在没有while 循环的情况下计算count 变量,这似乎计算了[j, k] 中有多少元素可以被h 整除(或者,等效地,是h 的倍数)。

为此,请使用以下事实:

  1. 能被k整除的小于或等于x的数由x / k的整数部分给出,不包括0

  2. 如果f(x, k) = int(x / k),则[j, k] 中可被h 整除的数字数量由f(k, h) - f(j - 1, h) 给出。

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2012-12-19
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多