我必须用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的声明,以保持代码简洁明了。
答案 0 :(得分:3)
对于初学者,不要使用像3这样的幻数。而是使用命名常量。
在本声明中
if(a[i]<a[k])
您正在比较同一数组a
的元素,而不是将a
的元素与数组b
的元素进行比较。
在while循环之前,您必须将变量count
和k
设置为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))。