从-1到1的四个数字加起来就是1

  • 本文关键字:数字 四个 起来 c++
  • 更新时间 :
  • 英文 :


我正试图从(-1,-0.99,-0.98,…0.98,0.99,1(中生成四个数字的每一个组合,这些数字的总和为1。

我试过在C++中使用它,但它并没有像我想要的那样工作。以下是示例:

    // C++ program for to print all combination
// of 4 elements in A[] with sum equal to X
#include<bits/stdc++.h>
using namespace std;
/* Following function is needed
for library function qsort(). */
int compare (const void *a, const void * b)
{
    return ( *(int *)a - *(int *)b );
}
/* A sorting based solution to print
all combination of 4 elements in A[]
with sum equal to X */
void find4Numbers(double A[], int n, double X)
{
    int l, r;
    // Sort the array in increasing
    // order, using library function
    // for quick sort
    qsort (A, n, sizeof(A[0]), compare);
    /* Now fix the first 2 elements
    one by one and find
    the other two elements */
    for (int i = 0; i < n - 3; i++)
    {
        for (int j = i+1; j < n - 2; j++)
        {
            // Initialize two variables as
            // indexes of the first and last
            // elements in the remaining elements
            l = j + 1;
            r = n-1;
            // To find the remaining two
            // elements, move the index
            // variables (l & r) toward each other.
            while (l < r)
            {
                if( A[i] + A[j] + A[l] + A[r] == X)
                {
                    cout << A[i]<<", " << A[j] <<
                        ", " << A[l] << ", " << A[r] << endl;
                    l++; r--;
                }
                else if (A[i] + A[j] + A[l] + A[r] < X)
                    l++;
                else // A[i] + A[j] + A[l] + A[r] > X
                    r--;
            } // end of while
        } // end of inner for loop
    } // end of outer for loop
}
/* Driver code */
int main()
{
    /*int A[202];
    for(int i=0; i<201; i++){
        A[i]={i};
    }
    A[202]=0;
    int X = 70;
    int n = 202;*/
    double A[] = {-1,-0.99,-0.98,-0.97,-0.96,-0.95,-0.94,-0.93,-0.92,-0.91,-0.9,-0.89,-0.88,-0.87,-0.86,-0.85,-0.84,-0.83,-0.82,-0.81,-0.8,-0.79,-0.78,-0.77,-0.76,-0.75,-0.74,-0.73,-0.72,-0.71,-0.7,-0.69,-0.68,-0.67,-0.66,-0.65,-0.64,-0.63,-0.62,-0.61,-0.6,-0.59,-0.58,-0.57,-0.56,-0.55,-0.54,-0.53,-0.52,-0.51,-0.5,-0.49,-0.48,-0.47,-0.46,-0.45,-0.44,-0.43,-0.42,-0.41,-0.4,-0.39,-0.38,-0.37,-0.36,-0.35,-0.34,-0.33,-0.32,-0.31,-0.3,-0.29,-0.28,-0.27,-0.26,-0.25,-0.24,-0.23,-0.22,-0.21,-0.2,-0.19,-0.18,-0.17,-0.16,-0.15,-0.14,-0.13,-0.12,-0.11,-0.1,-0.09,-0.08,-0.07,-0.06,-0.05,-0.04,-0.03,-0.02,0.01,0,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,0.2,0.21,0.22,0.23,0.24,0.25,0.26,0.27,0.28,0.29,0.3,0.31,0.32,0.33,0.34,0.35,0.36,0.37,0.38,0.39,0.4,0.41,0.42,0.43,0.44,0.45,0.46,0.47,0.48,0.49,0.5,0.51,0.52,0.53,0.54,0.55,0.56,0.57,0.58,0.59,0.6,0.61,0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.7,0.71,0.72,0.73,0.74,0.75,0.76,0.77,0.78,0.79,0.8,0.81,0.82,0.83,0.84,0.85,0.86,0.87,0.88,0.89,0.9,0.91,0.92,0.93,0.94,0.95,0.96,0.97,0.98,0.99,1
};
    double X = 1;
    int n = sizeof(A) / sizeof(A[0]);
    find4Numbers(A, n, X);
    return 0;
}

它给出的数字总和为1,但输出并没有给出每个组合。例如,数字0,1,0.12和-0.12不会显示。我正在查找这些号码的列表,我甚至不需要代码。数字可以重复,所以(0,0,0.5,0.5(也可以。

你能告诉我在哪里可以生成列表,或者如何制作一个提供列表的程序吗?

对于初学者来说,您的比较函数是错误的,因为您比较的是int而不是double。因此,请尝试:

int compare (const void *a, const void * b)
{
    double ca = *((double *) a);
    double cb = *((double *) b);
    return (ca > cb) - (ca < cb);
}

最新更新