C - 整数之间 2 个变量的组合 [ARRAY]

标签 c arrays combinations

该程序将列出所有可能的组合,其中 + 和 - 可以放在整数之间:

假设我有 3 个整数: 输入: 4 5 6

所以,我可以放置 + 和 - 符号,有 [4] 种可能的组合: 这是: 输出: 4+5+6, 4-5-6, 4+5-6, 4-6+5

我认为这种可能组合的公式是2的N次方,其中 N 是整数之间的空格数。

这是我的代码:

#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(){
    int i,j,sign,space=0,z=0,x=0,y=0,count=0,a=0,d,
    flag=0,combi,m,n;
    srand((unsigned) time(NULL));
    char string[100][100],c,hold[100][100],fin[x][y];

    char num[100]="1 2 3";

    for(i=0;i<strlen(num);i++){
        if(isspace(num[i]))
        space++;
    }
    combi=pow(2,space);

    for(i=0;i<combi;i++){
        strcpy(string[i],num);
    }
    for(i=0;i<combi;i++){
        printf("%d: [%s]\n",i+1,string[i]);
    }

//    strcpy(hold,string);

    for(x=0;x<combi;x++){
//        check:

        for(y=0;y<strlen(string);y++){
            if(isspace(string[x][y])){
                sign=rand()%2;
                if(sign==0){
                    c='+';
                }else{
                    c='-';
                }
                string[x][y]=c;
            }
        }
        strcpy(hold[z],string[x]);
        z++;
        if(a==0){
            strcpy(hold[z],string[x]);
//            printf("[%d]",z);
            z++;
            a++;
        }
        else{
            check:
            for(d=0;d<z;d++){
            check:
                if(strcmp(hold[d],string[x])!=0){
                    flag++;
                }
                else if(strcmp(hold[d],string[x])==0){
                     for(y=0;y<strlen(string[x]);y++){
                        if((string[x][y])==','||(string[x][y])=='_'){
                            sign=rand()%2;
                            if(sign==0){
                                c='+';
                            }else{
                                c='-';
                            }
                            string[x][y]=c;
                        }
                    }
                    goto check;
                }

                ///
                ///
                if(flag==z){
                    strcpy(hold[z],string[x]);
                    z++;
                    a++;
                    flag=0;
                }
            }
        }

    }
    printf("\n\n");
    for(i=0;i<combi;i++){
        printf("%d: %s\n",i+1,hold[i]);
    }
    printf("\n\n");


}

但我认为由于循环数量,这会导致内存问题 执行以找到唯一的组合。

有人可以帮助我吗?如何使这段代码可执行?

最佳答案

这是代码,要理解我做了什么,您需要绘制一棵二叉树并开始从底部添加和减去值。

#include <stdio.h>
#include <stdlib.h>

// mul is pow for ints ... just use (int)pow(x,y) and include <math.h> 

int mul(int a , int x ) {
  int i ;
  int val = 1 ; 
  for(i=0 ; i< x ; i++) {
    val *= a ; 
  }
  return val ; 
}

void sum(int *arr , int n , int* res) {

int * tmp = malloc(mul(2,n)*sizeof(int)) ;
int tmpSize = mul(2,n) ; 

if(!tmp) {
  printf("Your input size is to large") ;
  return ;
}

tmp[0] = arr[0] + arr[1] ; 
tmp[1] = arr[0] - arr[1] ; 

int i , j , p=0 , k=2 ;
for( i=2 ; i< n ; i++ ){
  for ( j=0 ; j<mul(2,i-1) ; j++ ) {

    tmp[k] = tmp[p+j] + arr[i] ; 
    tmp[k+1] = tmp[p+j] - arr[i] ; 
    k += 2 ; 
  }
  p= mul(2,i+1) - mul(2,i) - 2 ;
}

 int index = mul(2,n) - mul(2,n-1) - 2 ; 
 for( i=0 ; i<mul(2,n-1); i++ ) {
   res[i] = tmp[index+i] ;
 }

}

int main(void) {

 int a[4] = { 3,2,6,8 } ;  
 int res[16] = {0} ; 
 sum(a,4,res) ; 
 int i ;
 for (i=0 ;i<8 ; i++) {
   printf("%d\n",res[i]) ;
 }

 return 0;
}

关于C - 整数之间 2 个变量的组合 [ARRAY],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957903/

相关文章:

android - cpu-features.h 没有这样的文件或目录 webrtc Android 构建

javascript - 如何在components.ts文件中使用KeyValuePipe?

arrays - 在零数组中找到第一个 "1"

r - 将列表粘贴到矢量,为每个矢量级别重复列表

c++ - 我所有变量的运行时检查失败 #2 错误

c - 使用 struct 作为输入/输出参数的单一功能接口(interface)

c# - 如何从 C# 调用 c 函数

c++ - 使用构造函数初始化对象数组

php - 用 PHP 创建所有可能的组合

javascript - Objective-C 与 JavaScript 循环性能对比