N個の整数の組み合わせの絶対値を計算する

N個(a..N)の場合、以下の方法ですべての組み合わせのセットを探しています。

void create_print_combinations(int *t, int x, int n) {
    if(x == 0) {
        char p [2 * r + 2];
        memset (p, 0, 2 * r +2);
        for (int j=c;j>0;j--)
            if(j == c)
                sprintf(p, "%d", t[j]);
            else
                sprintf(p, "%s,%d", p,t[j]);
            print_combi(p);
    } else {
         for (int i= n; i < r; i++) {
             t[x] = a[i];
             create_print_combinations(t, x-1, i+1);
         }
    }
}

したがって、次のような関数呼び出しがあります:

int main() {
    unsigned long int start=0, end=0;
    printf ("\nEnter the a positive integer N:");
    scanf("%d", &r);
    start=time(NULL);
    a = new int[r];
    for (int i = 0;i

N = 4のような組み合わせを私に与えます:

正の整数Nを入力してください:4

Combo : [1]
Combo : [2]
Combo : [3]
Combo : [4]
Combo : [1,2]
Combo : [1,3]
Combo : [1,4]
Combo : [2,3]
Combo : [2,4]
Combo : [3,4]
Combo : [1,2,3]
Combo : [1,2,4]
Combo : [1,3,4]
Combo : [2,3,4]
Combo : [1,2,3,4]

今私の仕事は、次のようなすべての組み合わせの絶対値を好きにすることです:

コンボ[1,2,3,4]の場合は、次のようにする必要があります。

1+2+3+4 = abs(1+2+3+4)
1+2+3-4 = abs(1+2+3-4)
1+2-3-4 = ..
1-2-3+4 = ...

それでは

私は以下の論理を試しています:

while(pos > 0)
{
for(int a=0; a < i; a++)
{
if(a==0)
sprintf(p,"%d", t[a]);
else if(a == pos)
sprintf(p,"%s%c%d",p, minus, t[a]);
else
sprintf(p,"%s%c%d",p, plus, t[a]);
}
print(p);
memset (p , 0, 2 * r +2);
pos --;
}

しかし、私はすべてのセットが印刷されていないので、私は間違って何かをしているbeleiev。私は完了までに近いと感じていますが、私は論理を構成することができません。以下は私の全プログラムです:

#include 
#include 
#include 
#include 
#include 

int *a;
int *a1;
int r;
int c;
unsigned long int no =1;

int stoi(char *var)
{
int n1 = 0;
int n2 = 0;
int n3 = 0;
char sign=0;
while(*var)
{
if(isspace(*var))
{
var++;
continue;
}
while(*var >= '0' && *var <= '9')
{
n1=(n1*10) + (*var - '0');
var++;
continue;
}
if(sign == '+')
{
n2=n2+n1;
n1=0;
}
else if(sign == '-')
{
n2=n2 - n1;
n1=0;
}
if(*var == '+' || *var == '-')
{
if(sign == 0)
{
n2=n1;
n1=0;
}
sign = *var;
}
var++;
}
if(sign == 0)
return abs(n1);
return abs(n2);
}

void print(char* var)
{
printf("[Combo %llu.] %s = %d\n" , no++, var, stoi(var));
}

void print_combi(char * a)
{
int t[c];
char *x = NULL;
char *y = a;
int i=0;
while((x=strchr(y, ',')) != NULL)
{
*x = '\0';
t[i++]=atoi(y);
y=x+1;
}
t[i++]=atoi(y);
int count =0;
int loop = 0;
char p [2 * r + 2];
memset (p , 0, 2 * r +2);
char plus = '+';
char minus = '-';
for(int k=0;k<2;k++)
{
if(k==1)
{
plus =  '-';
minus = '+';
}
if(i>1)
{
for(int a=0; a < i; a++)
{
if(a==0)
sprintf(p,"%d", t[a]);
else
sprintf(p,"%s%c%d",p, plus, t[a]);
}
}
else if(i==1)
{
sprintf(p,"%d", t[i-1]);
print(p);
break;
}
print(p);
memset (p , 0, 2 * r +2);
if(i==2)
continue;
if(i==3 && k ==1)
break;
int pos = i-1;
while(pos > 0)
{
for(int a=0; a < i; a++)
{
if(a==0)
sprintf(p,"%d", t[a]);
else if(a == pos)
sprintf(p,"%s%c%d",p, minus, t[a]);
else
sprintf(p,"%s%c%d",p, plus, t[a]);
}
print(p);
memset (p , 0, 2 * r +2);
pos --;
}
}
}

void create_print_combinations(int *t, int x, int n)
{
if(x == 0)
{
char p [2 * r + 2];
memset (p, 0, 2 * r +2);
for (int j=c;j>0;j--)
if(j == c)
sprintf(p, "%d", t[j]);
else
sprintf(p, "%s,%d", p,t[j]);
print_combi(p);
}
else
for (int i= n; i < r; i++)
{
t[x] = a[i];
create_print_combinations(t, x-1, i+1);
}
}
int main()
{
unsigned long int start=0, end=0;
printf ("\nEnter the a positive integer N:");
scanf("%d", &r);
start=time(NULL);
a = new int[r];
for (int i = 0;i

プログラムのロジックごとに、私は文字列として組み合わせを計算しており、式の絶対値を生成しています。

0

4 答え

あなたがやっていることへのより簡単な方法があります。あなたはN個の整数のベクトルを加算したい:

[1 * k1,2 * k2,3 * k3 ... N * kN]

ここで、kx = -1,0、+ 1である。

x = 1..Nのkxの3 ^ Nの組み合わせがあります。

1
追加された
私は論理的に思いついた概念/アプローチと、それにマップされた必要なコード実装を理解したいと思います。私はこれらが私が巧みにする必要があるものだと思います。いくつかの入力を明示的に提供してください。私はO(lonN)..などのコンセプトも見たことがありますが、実際にはほとんど分かりません。
追加された 著者 Prakash,
あなたはベクトル[1、2、3、... N]で始まります。N個の要素のすべての組み合わせをとりました。これは0または+1で乗算することと等価です。次に、+1要素をすべて取り、加算または減算します。これは、+1または-1を掛けることと同じです。私はちょうどあなたが1つのステップでこれを行うことができることに気づいた。
追加された 著者 Steve C,

あなたがしようとしていることは、「N choose one」から「N choose N」までのすべての組み合わせを列挙することと非常によく似ています。私はあなたがGoogleで検索用語 "組み合わせを列挙"

ここに私が見つけたリンクの1つがあります:

http://www.codeproject.com/KB/recipes/CombC.aspx

0
追加された
はい、私はコードをcreate_print_combinationsメソッドを介して組み合わせを生成することができます - 私の問題は、すべての組み合わせの絶対値の合計を印刷するロジックを得ることができないということです:Combi 1,2,3:1 + 2 + 3、 1 + 2-3,1-2 + 3,1-2-3。私の論理は、より大きな値がn = 10であることを意味します。
追加された 著者 Prakash,

@ SteveCの解決策のいくつかのコード:

#include 
#include 
using namespace std;
void print_sum(int N, int sum_so_far, string as_a_string) {
        if(N) {
                ostringstream oss; oss << N;
                print_sum(N-1, sum_so_far+N, as_a_string + "+" + oss.str() + " ");
                print_sum(N-1, sum_so_far-N, as_a_string + "-" + oss.str() + " ");
                print_sum(N-1, sum_so_far, as_a_string);
        } else {  
                if (sum_so_far < 0) sum_so_far *= -1;
                cout << as_a_string << "\t= " << sum_so_far << endl;            }
}

int main() {
        print_sum(4, 0, "");
}

出力が始まります:

+4 +3 +2 +1     = 10
+4 +3 +2 -1     = 8
+4 +3 +2        = 9
+4 +3 -2 +1     = 6
+4 +3 -2 -1     = 4
+4 +3 -2        = 5
+4 +3 +1        = 8
+4 +3 -1        = 6
# .. and so on
0
追加された
@SteveC、+1良い点。これらの変更を含め、私のコードをあなたの答えにコピーしてください。あなたは受け入れられた答えを得なければなりません!とにかく数時間はオフラインになります。
追加された 著者 Aaron McDaid,
再帰呼び出しではNを上に、N-1を渡すだけです。 xの必要はありません。結果に絶対値を出力する必要もあります。
追加された 著者 Steve C,
私はあなたの解決策を整理しました。いいね。
追加された 著者 Steve C,

それを行う方法に関する論理があります。 n-1 のサイズのバイナリ数字をすべて出力します。 n はそれぞれのコンボのサイズ(要素数)です。例えば、コンボ[1,2,3,4]に対してしたいことをするには、 3 (n-1 = 3、ここではn = 4要素)のバイナリの組み合わせをすべて作成します。すなわち、

when n = 3, the possible combinations are:
000
001
010
011
100
101
110
111

0 が追加され、 1 が減算されるといつでも、forループとその内部でコンボを実行します。たとえば 000 1 + 2 + 3 + 4 を意味し、 101 1-2 + 3-4

0
追加された