C语言:我想看看a []的值是否小于b []的所有值

时间:2018-03-17 10:02:14

标签: c arrays algorithm for-loop while-loop

我必须用C解决练习。练习要求我从输入中得到2个数组(a,b),看看是否有一个[]的值小于b的所有值。 两个阵列都有3个元素。 我写的代码如下:

for (int i = 0; i < 3; ++i)
{
    while(k<3)
    {
        if(a[i]<a[k])
        {
            count++;
            if (count==3)
            {
                break;
            }
        }
        k++;
    }
    count=0;
}

if (count==3)
{
    printf("TRUE");
}
else
{
    printf("FALSE");
}

代码的问题是它在我给出的任何输入中都会输出false。 任何帮助,将不胜感激。 附:我省略了数组键盘的扫描和i和k的声明,以保持代码简洁明了。

3 个答案:

答案 0 :(得分:3)

对于初学者,不要使用像3这样的幻数。而是使用命名常量。

在本声明中

if(a[i]<a[k])

您正在比较同一数组a的元素,而不是将a的元素与数组b的元素进行比较。

在while循环之前,您必须将变量countk设置为0。

for (int i = 0; i < 3; ++i)
{
    k = 0;
    count = 0;
    while(k<3)

break语句打破while循环,但它不会破坏外部for循环。

代码不确定数组a的目标元素的位置是否小于数组b的所有元素。

您可以编写一个单独的函数来完成任务。

这是一个示范程序。

#include <stdio.h>

size_t find_less_than( const int a[], const int b[], size_t n )
{
    size_t i = 0;

    for ( _Bool found = 0; !found && i < n; i += !found )
    {
        size_t j = 0;
        while ( j < n && a[i] < b[j] ) j++;

        found = j == n;
    }

    return i;
}

int main(void) 
{
    enum { N = 3 };

    int a[N], b[N];

    printf( "Enter %d values of the array a: ", N );
    for ( size_t i = 0; i < N; i++ ) scanf( "%d", &a[i] );

    printf( "Enter %d values of the array b: ", N );
    for ( size_t i = 0; i < N; i++ ) scanf( "%d", &b[i] );

    size_t i = find_less_than( a, b, N );
    if ( i != N )
    {
        printf( "The element at position %zu with the value %d of the array a\n"
                "is less than all elements of the array b\n", i, a[i] );
    }
    else
    {
        puts( "There is no element in the array a\n"
              "that is less than all elements of the array b\n" );
    }

    return 0;
}

它的输出可能看起来像

Enter 3 values of the array a: 3 0 1
Enter 3 values of the array b: 1 2 3
The element at position 1 with the value 0 of the array a
is less than all elements of the array b

答案 1 :(得分:1)

编写程序是机制。当然,起初看起来很有挑战性,但它很快变得容易;你只需要将解决方案的描述(&#34;首先执行此操作,然后执行此操作&#34;)翻译成编程语言。

真正的艺术提出了很好的解决方案。例如,一个好的解决方案不会浪费时间或空间。它也可以扩展到更大的问题。

在这个问题中,显而易见的解决方案是从Column not found: 1054 Unknown column 'languages.comment_id' in 'where clause' (SQL: select * from `languages` where `languages`.`comment_id` = 7 and `languages`.`comment_id` is not null)' 轮流获取每个元素,看它是否小于a的每个元素。在最坏的情况下,这将涉及将b的每个元素与a的每个元素进行比较。如果它们只有三个元素,那么这并不重要,但假设它们有一百万个元素。然后,该程序最终可能会将b的每个元素与a的每个元素进行比较,总计1,000,000,000,000个比较。即使在现代硬件上,也需要很长时间。

但是有一个简单的改进。如果b中的元素不小于a的任何元素,则它不小于b的最小元素。相反,如果它小于b的每个元素,那么它显然小于b的最小元素。

因此没有必要与b的每个元素进行比较;只有最小元素b。我们最初并不知道该元素是什么,但可以直接扫描b一次以找到它,然后在b的扫描中使用它。这让我们解决了百万元素问题,最多只有1,999,999个比较,我认为你会同意它更实用。

有时嵌套循环是必要的。但是当你看到一个,你应该总是至少问自己,&#34;有更好的解决方案吗?&#34;因为编程的艺术和乐趣不是将算法机械转换为代码;这是更好的解决方案向你揭示的尤里卡时刻。

答案 2 :(得分:0)

要检查a中的值是否小于b的所有值,可以使用double for循环:

for (int i = 0; i < 3; ++i)
{
    int count= 0;
    for (int j = 0; j < 3; ++j)
    {
        if(a[i]<b[j])
        {
            count++;
        }
    }
    if (count==3) break;
}
if (i<3) printf("%d\n", a[i]);

<小时/> 另一种更快的方法是首先找到最小的a,然后检查每个b是否更小:

int smallest= a[0];
for (int i = 1; i < 3; ++i)
    if (a[i]<smallest) smallest=a[i];

int count= 0;
for (int i = 0; i < 3; ++i)
    if(<b[i]<smallest)
        count++;

if (count==3) printf("yes\n");

第一个版本有一个嵌套循环,因此有n * n次迭代。第二个只有n + n次迭代(也称为O(n 2 )和O(n + n))。