2016-07-19 23 views
0

我正在寻找使这更高效。执行这个简单的程序需要很长时间。我的C解决方案的多重性问题太慢了,需要建议

有什么建议可以让它运行得更快?我不确定我做错了什么让这么慢。

仅供参考这只是一个实践问题,对我的编码技能的工作..帮助表示赞赏。这是写在C.

问题: 计算其是小于1000

#include <stdio.h> 

int sumOfFivesAndThrees(int start, int limit){ 
    int sum = start; 
    int idx = 0; 

    printf("Your input is: %i\n", start); 

    while(idx <= limit) { 
     if(! idx % 3){ 
      sum = sum + idx; 
      printf("IDX(3): %i\n", idx); 
     } 
     else if(! idx % 5){ 
      sum = sum + idx; 
      printf("IDX(5): %i\n", idx); 
     } 
     idx++;  
    } 

    return sum; 
} 

int main() 
{ 
    int answer = 0; 

    answer = sumOfFivesAndThrees(answer, 1000); 

    printf("Your of 3's and 5's is: %i\n", answer); 

    return 0; 
} 
+0

[你可能要问上CodeReview改为](http://codereview.stackexchange.com/) – Draken

+2

'printf'语句将大大减缓它的速度。 – Galik

+2

不知道你想要解决的问题实际上*并没有多大帮助。目前还不清楚你知道表达式'!idx%n'实际上*做了什么*(与'!(idx%n)'相反)。逻辑 - 不是一个只会是0的计数器(因此表达式“true”*一次*),然后采用模“3”似乎很奇怪。 – WhozCraig

回答

2

按照以下步骤

  • 初始化IDX由3.增加IDX的3和5的倍数的总和由3直到限制。将所有idx添加到总和中。
  • 将idx初始化为5.将idx加5直到限制。将所有idx添加到总和中。
  • 将idx初始化为15.将idx增加15,直至达到限制。从总和中减去所有的idx。
+1

因此,序列将是3,5,7,9,11,对吗? –

+0

谢谢Jarod42。抱歉,是我的错。我已更新我的解决方案。 – Boka

1

您应该设置sum = 0而不是sum = start;

2

请避免%操作。从开始检查第一个整除3个数然后增加3并加上所有总和直到限制。然后用5号签的第一个除尽,然后由5递增并都添加到先前总和,直至极限

+1

所以,你计算倍数15两次.... – Jarod42

+0

第二次我们应该离开3整数 –

4

更快的解决方案是使用Arithmetic progression

int sumOfMultipleOfX(int minRange, int maxRange, int mul) 
{ 
    minRange = ((minRange + mul - 1)/mul) * mul; // Ceil to multiple 
    maxRange = (maxRange/mul) * mul;    // Floor to multiple 

    if (maxRange < minRange) { // Check input arguments. 
     return 0; 
    } 
    return (maxRange + minRange) * (maxRange - minRange + mul)/(2 * mul); 
} 

int sumOfMultipleOf3Or5(int minRange, int maxRange) 
{ 
    return sumOfMultipleOfX(minRange, maxRange, 3) 
     + sumOfMultipleOfX(minRange, maxRange, 5) 
     - sumOfMultipleOfX(minRange, maxRange, 15); // Count multiple of 15 only once 
} 

Demo