有没有一种方法来优化代码并提高K个和数项而不是4个?

有没有一种方法来优化代码并提高K个和数项而不是4个?

问题描述:

#include <stdio.h> 
int main() { 
    int N = 133; 
    int a, b, c, d; 
    int flag = 0; 
    for (int j = 1; j < (N/2); j++) 
    { 
    a = j; 
     for (int k = 1; k < (N/2); k++) 
     { 
     b = k; 
     for (int l = 1; l < (N/2); l++) 
     { 
     c = l; 
     for (int m = 1; m < (N/2); m++) 
     { 
     d = m;  
     if (a+b+c+d == N && (a != 0 && b!= 0 && c != 0 && d!= 0)) 
     { 
       printf("\n %d + %d + %d + %d = %d" , a, b, c, d, N); 
       flag = 1; 
       break; 
     } 
     } 
     if(flag) 
      break; 
     } 
     if(flag) 
      break; 
     } 
     if(flag) 
      break; 
    } 
return 0; 
} 

代码目前输出有没有一种方法来优化代码并提高K个和数项而不是4个?

1 + 2 + 65 + 65 = 133 

正如你可以看到,我正在用4个数字在这种情况下,以形成N(133)的总和。有没有一种方法可以在不使用嵌套的'k'for循环的情况下将代码改进为'k'数字?

Desired Output: (a + b + c + d + e + f + ...... + k = N) 

对于用k个项的和表示的给定值N表示,其中k是输入参数。

注:

  • 的数 'k' 的术语都不是零。
  • 原始问题有从0开始的循环;更新为从1开始。
  • 具体要求,我希望术语(a到k)在所有总和中具有最低的可能标准差。因此,在第一笔款项中突破并不理想,但这是我所达到的基准代码。一旦我找出减少循环次数,我知道如何修改最低的S.D.
  • 也非常明显,但在所有情况下都是N <。
+0

为了简单起见,我限制了内循环运行到N/2。 – deathbycode

+1

您必须了解递归 - 当函数自行调用时。 –

+1

不是你在问什么,而是一个优化,*跳到你的脸上*将启动在'1'处的所有循环。无论如何,你不会在乎'0'加数的结果! –

很多简单的代码,做同样的事情你:

#include <stdio.h> 
int main() 
{ 
    int N = 133; 
    for (int j = 1; j < (N/2); j++) 
    for (int k = 1; k < (N/2); k++) 
     for (int l = 1; l < (N/2); l++) 
     for (int m = 1; m < (N/2); m++) 
      if (j+k+l+m == N) { 
      printf("\n %d + %d + %d + %d = %d" , j, k, l , m, N); 
      return 0; 
      } 
} 

和你的问题,这是一个有点模糊,但似乎找到k个A_1,A_2 ... a_k这样1 < a_n <对于所有n和a_1 + a_2 + ... + a_k = N,N/2。这是非常简单的代码来做到这一点,使用你的算法,但扩展为任意k:

#define N 133 
#define k 8 

int main() 
{ 
    int arr[k]; 
    for(int i=0; i<k; i++) 
    arr[i]=1; 
    for(int i=0,c=k; c<N; c++) { 
    arr[i]++; 
    if(arr[i]>=N/2) { 
     c--; 
     i++; 
    } 
    } 
    for(int i=0; i<k-2; i++) 
    printf("%d + ", arr[i]); 
    printf("%d = %d\n", arr[k-1], N); 
} 

它没有错误检查。该问题对于k = 1和k> N是不可解的。并且因为整数除法被舍入,所以如果N是奇数,则对于k = 2是不可解的。

但这里有一些更高效的代码。问题很简单,所以它不是要找到数字a_1,a_2,a_3 ... a_k。这实际上只是关于找到a_1和a_2。其余的都是一个。

#define N 19 
#define k 5 

int main() 
{ 
    for(int i=0; i<k-2; i++) 
    printf("1 + "); 

    int c=N/2-(k-2); 
    if (c<1) 
    c=1; 
    printf("%d + ", c); 
    printf("%d = %d\n", N-(k-2)-c, N); 
} 

再次,没有进行错误检查。

+2

嗯。这里缺少大括号似乎使变量'j,...,m'的范围不明显。 –

+0

@DavidBowling即使只有一条语句,也有一些更喜欢大括号。我不。 – klutt

+0

谢谢,这真的很有帮助。 :) – deathbycode