有没有一种方法来优化代码并提高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 <。
很多简单的代码,做同样的事情你:
#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);
}
再次,没有进行错误检查。
嗯。这里缺少大括号似乎使变量'j,...,m'的范围不明显。 –
@DavidBowling即使只有一条语句,也有一些更喜欢大括号。我不。 – klutt
谢谢,这真的很有帮助。 :) – deathbycode
为了简单起见,我限制了内循环运行到N/2。 – deathbycode
您必须了解递归 - 当函数自行调用时。 –
不是你在问什么,而是一个优化,*跳到你的脸上*将启动在'1'处的所有循环。无论如何,你不会在乎'0'加数的结果! –