繁体   English   中英

遍历数组,检查a + b + c == A,但避免重新检查c + b + a等

[英]Loop through an array, check if a+b+c == A but avoid rechecking c+b+a etc

我已经确定了这一点,但是考虑到它返回并检查同一件事(a + b + c和a + c + b以及其他变体,而不仅仅是a + b + c),它的效率很低。

有什么办法可以避免这种情况? 我的代码如下:

int array[8]={4,5,6,0,3,2,1,9};
int i = 0, j = 0, k = 0, nmbr = 10;
for(i=0; i<8; ++i){
        for(j=0; j<8; ++j){
                for(k=0; k<8; ++k){
                    if((array[i]+array[j]+array[k]) == nmbr)
                        printf("%d is found with %d + %d + %d\n", nmbr, array[i], array[j], array[k]);
                }
        }
}

任何帮助,将不胜感激。

i开始j ,从j开始k ,或者如果解决方案中不允许重复索引,则让ji+1开始,而kj+1

int array[8]={4,5,6,0,3,2,1,9};
int i = 0, j = 0, k = 0, nmbr = 10;
for(i=0; i<8; ++i){
        for(j=i; j<8; ++j){
                for(k=j; k<8; ++k){
                    if((array[i]+array[j]+array[k]) == nmbr)
                        printf("%d is found with %d + %d + %d\n", nmbr, array[i], array[j], array[k]);
                }
        }
}

更改:

for(i=0; i<8; ++i){
        for(j=0; j<8; ++j){
                for(k=0; k<8; ++k){

至:

for(i=0; i<8-2; ++i){
        for(j=i+1; j<8-1; ++j){
                for(k=j+1; k<8; ++k){

注意:这假设ijk必须是不同的。 尽管这不是必需的,但很容易更改:

for(i=0; i<8; ++i){
        for(j=i; j<8; ++j){
                for(k=j; k<8; ++k){

j = i开始第二个循环,从k = j第三个循环(如果总和不能等于两倍,则每个+ 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM