数字之间的比较

时间:2018-06-13 09:25:46

标签: c++ numbers

我们说我有一个包含此内容的文件:

6 
8 
9 
12 
15
20

我将第一个数字与其他数字进行比较,然后将第二个数字与其下面的所有数字进行比较等。

对于每次比较,我都在查看这两个数字是否相隔小于10。然后我打印出所有符合这种条件的数字。

此时我应该有这样的事情:

6 8
6 9
6 12 
6 15
8 9
8 12
8 15
9 12
9 15
12 15
12 20
15 20

但最后,我想要的是采取与条件相关的最小值和最大值并删除其余值。所以我应该:

6 15

因为这两个数字是关于条件的列表的最小值和最大值(相差小于10)。

然后在列表中只剩下20个。从列表中删除6,8,9,12和15。 我尝试做类似的事情,但看起来并不好看:

  for(int i=0;i<6;i++)
       {
           for(int j=i+1;j<6;j++)
           {

               if((std::abs(number[j]-number[i])<=10))
               {
                   if(number[j]<=number[j+1])
                   {
                       number[j]=number[j+1];
                   }

               }
           }
       }

此外,该列表总共可以包含10.000个值。

知道怎么做对吗?

2 个答案:

答案 0 :(得分:0)

随着进步,保持最佳答案如何。

int ans_a,ans_b,maxDiffSoFar = 0;
//...

int tempDiff = std::abs(number[j]-number[i]);
if(tempDiff <= 10 && tempDiff > maxDiffSoFar)
{
     maxDifSoFar = tempDiff;
     ans_a = number[i];
     ans_b = number[j];
}

编辑: 澄清后,

int ans_a=INT_MAX,ans_b;
//...

int tempDiff = std::abs(number[j]-number[i]);
if(tempDiff <= 10 && (ans_a > number[i] || (ans_a == number[i] && ans_b < number[j]) ))
{
     ans_a = number[i];
     ans_b = number[j];
}

答案 1 :(得分:0)

可能是以下代码将帮助您解决问题。我希望我能正确理解你的问题,你走了。

#include<iostream>
#include<cmath>

int main()
{
    int arr[] = {6, 8, 9, 12, 15, 20, 22, 45, 99, 205};
    std::cout << "All possible combinations:" << std::endl;
    for(int i = 0; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
        for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
            std::cout << arr[i] << " " << arr[j] << std::endl;

    std::cout << std::endl << "Combinations respecting the condition:" << std::endl;
    for(int i = 0; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
        for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
            if(std::abs( arr[i] - arr[j]) < 10)
                std::cout << arr[i] << " " << arr[j] << std::endl;

    std::cout << std::endl << "Combination of mimum and maximum value respecting the condition:" << std::endl;
    int max_difference = 0, max_index = 0, min_index = 0;
    for(int i = 0; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
        for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
            if( (std::abs( arr[i] - arr[j]) > max_difference) && (std::abs( arr[i] - arr[j]) < 10) )
            {
                max_difference = std::abs( arr[i] - arr[j]);
                if(arr[i] > arr[j])
                {
                    max_index = i;
                    min_index = j;
                }
                else
                {
                    max_index = j;
                    min_index = i;
                }
            }
    std::cout << arr[min_index] << " " << arr[max_index] << std::endl;

    std::cout << std::endl << "The last combinations respect the condition, but beyond the minimu and maximum range:" << std::endl;
    for(int i = max_index + 1; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
        for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
            if( std::abs( arr[i] - arr[j]) < 10 )
                std::cout << arr[i] << " " << arr[j] << std::endl;

    std::cout << std::endl << "Values never satisy the condition and beyond the minimu and maximum range:" << std::endl;
    for(int i = (sizeof(arr)/sizeof(*arr)) - 1; i > max_index + 1; i--)
        for( int j = i - 2; j > max_index; j--)
            if( std::abs( arr[j] - arr[i]) >= 10 )
            {
                std::cout << arr[i] << std::endl;
                break;
            }
    return 0;
}

实际上你要找的答案是最后一个循环语句。以上所有其他内容只是为了确保我理解你的问题。以下是您正在寻找的简短答案:

    int max_difference = 0, max_index = 0, min_index = 0;
    for(int i = 0; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
        for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
            if( (std::abs( arr[i] - arr[j]) > max_difference) && (std::abs( arr[i] - arr[j]) < 10) )
            {
                max_difference = std::abs( arr[i] - arr[j]);
                if(arr[i] > arr[j])
                {
                    max_index = i;
                    min_index = j;
                }
                else
                {
                    max_index = j;
                    min_index = i;
                }
            }
    std::cout << arr[min_index] << " " << arr[max_index] << std::endl;

澄清后编辑
这里提供的解决方案假设数字按升序排列。这是您的解决方案,但不符合条件的数字按降序显示:

std::cout << std::endl << "The last combinations respect the condition, but beyond the minimu and maximum range:" << std::endl;
for(int i = max_index + 1; i < (sizeof(arr)/sizeof(*arr)) - 1; i++)
    for( int j = i + 1; j < (sizeof(arr)/sizeof(*arr)); j++)
        if( std::abs( arr[i] - arr[j]) < 10 )
            std::cout << arr[i] << " " << arr[j] << std::endl;

std::cout << std::endl << "Values never satisy the condition and beyond the minimu and maximum range:" << std::endl;
for(int i = (sizeof(arr)/sizeof(*arr)) - 1; i > max_index + 1; i--)
    for( int j = i - 2; j > max_index; j--)
        if( std::abs( arr[j] - arr[i]) >= 10 )
        {
            std::cout << arr[i] << std::endl;
            break;
        }

上面提供了整个代码。看看吧。请记住,我添加了45, 99, and 250。但是当它们显示时,它们将显示为:250, 99, 45。这很简单,你必须自己重新安排它。我希望它有所帮助。

问候。