我已经搜索了许多网站来找到这个问题。他们正在通过某种不同的方法进行。如果我将数组的第一个元素输入最大,即a[0]
,则此代码只是不会给出输出。我认为需要一些小的更改。有人可以告诉我吗?
#include <stdio.h>
int main() {
int a[10], n;
int largest1, largest2, i;
printf("enter number of elements you want in array");
scanf("%d", &n);
printf("enter elements");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
largest1 = a[0];
for (i = 0; i < n; i++) {
if (a[i] > largest1) {
largest1 = a[i];
}
}
largest2 = a[0];
for (i = 1; i < n; i++) {
if (a[i] > largest2 && a[i] < largest1)
largest2 = a[i];
}
printf("First and second largest number is %d and %d ", largest1, largest2);
}
(我将忽略处理输入,这只是一个干扰。)
简单的方法是对其进行排序。
#include <stdlib.h>
#include <stdio.h>
int cmp_int( const void *a, const void *b ) {
return *(int*)a - *(int*)b;
}
int main() {
int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
const int n = sizeof(a) / sizeof(a[0]);
qsort(a, n, sizeof(a[0]), cmp_int);
printf("%d %dn", a[n-1], a[n-2]);
}
,但这不是最有效的,因为它是O(n log n)
,这意味着随着数组的增加,比较数量更大。不太快,比指数慢,但是我们可以做得更好。
我们可以在O(n)
或"线性时间"中进行,这意味着随着数组的比较数量增长,以相同的速率增长。
循环穿过数组跟踪最大值,这是找到最大值的通常方法。当您找到新的最大值时,旧的最大将成为第二高的数字。
而不是让第二个循环找到第二高的数字,而是在特殊情况下以进入第二高的数字。
#include <stdio.h>
#include <limits.h>
int main() {
int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
// This trick to get the size of an array only works on stack allocated arrays.
const int n = sizeof(a) / sizeof(a[0]);
// Initialize them to the smallest possible integer.
// This avoids having to special case the first elements.
int max = INT_MIN;
int second_max = INT_MIN;
for( int i = 0; i < n; i++ ) {
// Is it the max?
if( a[i] > max ) {
// Make the old max the new 2nd max.
second_max = max;
// This is the new max.
max = a[i];
}
// It's not the max, is it the 2nd max?
else if( a[i] > second_max ) {
second_max = a[i];
}
}
printf("max: %d, second_max: %dn", max, second_max);
}
可能有一种更优雅的方法来做到这一点,但最多可以进行2n比较。充其量会做n。
请注意,有一个关于如何处理{ 1, 2, 3, 3 }
的问题。那应该返回3, 3
还是2, 3
?我将把它留给您以做出相应的决定。
您的代码问题是逻辑问题(这是最多的编码)。如果最大的数字是第一个,那么它会遇到第二大数字错误...为什么?
好吧,请查看您的逻辑,以决定第二大数字。您首先将其设置为等于数组中的第一个元素最大数字!)。
要解决它,您可以特殊情况:检查第一个数字是否是第一个,如果是的,则将其设置为第二个元素(然后是特殊情况,有人要求某人在一个元素中找到最高的两个元素数组,没有阅读阵列的末尾。)
我认为Chqrlie答案中给出的方法是最好的。也合乎逻辑:编写一个程序以找到最大的数字。第二大数字,那只是以前最大的!
您需要更好地保留数组成员的索引,因为它们是唯一的这是一个工作代码,有几个更改:
#include<stdio.h>
int main()
{
int a[10],n;
int largest1,largest2,i;
printf("enter number of elements you want in array");
scanf("%d",&n);
printf("enter elements");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
largest1=0;
for(i=0;i<n;i++)
{
if(a[i]>a[largest1])
{
largest1=i;
}
}
if(largest1!=0) // this condition to select another index than the largest
largest2=0;
else
largest2=n-1;
for(i=0;i<n && i != largest1 ;i++)
{
if(a[i]>a[largest2])
largest2=i;
}
printf("First and second largest number is %d and %d ",a[largest1],a[largest2]);
}
请注意,当数组的尺寸为1值时。您是否应该找到两个最大的不同值或两个最大的可能相同值?
您的代码似乎表示您想要第一种方法,但是如果最大的值是a[0]
,则有问题。您应该使用额外的布尔来跟踪您是否发现了其他价值。
您还应该测试不同scanf()
调用的返回值,然后从main()
返回0。
这是一个修改版本:
#include <stdio.h>
int main(void) {
int a[10], n, i;
int largest1, largest2, has_largest2;
printf("enter number of elements you want in array: ");
if (scanf("%d", &n) != 1)
return 1;
if (n < 2) {
printf("need at least 2 elementsn");
return 1;
}
printf("enter elements: ");
for (i = 0; i < n; i++) {
if (scanf("%d", &a[i]) != 1) {
printf("input errorn");
return 1;
}
}
largest1 = a[0];
for (i = 1; i < n; i++) {
if (a[i] > largest1) {
largest1 = a[i];
}
}
has_largest2 = largest2 = 0;
for (i = 0; i < n; i++) {
if (a[i] < largest1) {
if (!has_largest2) {
has_largest2 = 1;
largest2 = a[i];
} else
if (a[i] > largest2) {
largest2 = a[i];
}
}
}
if (has_largest2) {
printf("First and second largest number is %d and %dn",
largest1, largest2);
} else {
printf("All values are identical to %dn", largest1);
}
return 0;
}
您可以在一次通过中做得最好。
最大和最大2设置为INT_MIN进入时。然后逐步跨越数组。如果最大的数字小于数字,则最大的2变为最大,最大的是新数字(或者如果要允许重复)。如果最大的数字更大,则新数量,请测试最大2。
请注意,此算法会缩放到在数组中找到前三或四个,然后再变得太麻烦了,最好排序。
//我认为它很简单
#include<stdio.h>
int main()
{
int a1[100],a2[100],i,t,l1,l2,n;
printf("Enter the number of elements:n");
scanf("%d",&n);
printf("Enter the elements:n");
for(i=0;i<n;i++)
{
scanf("%d",&a1[i]);
}
l1=a1[0];
for(i=0;i<n;i++)
{
if(a1[i]>=l1)
{
l1=a1[i];
t=i;
}
}
for(i=0;i<(n-1);i++)
{
if(i==t)
{
continue;
}
else
{
a2[i]=a1[i];
}
}
l2=a2[0];
for(i=1;i<(n-1);i++)
{
if(a2[i]>=l2 && a2[i]<l1)
{
l2=a2[i];
}
}
printf("Second highest number is %d",l2);
return 0;
}
无需使用第三个循环来检查数组中的第二大数字。您只能使用两个循环(一个用于插入,另一个用于检查。
请参阅此代码。
#include <stdio.h>
int main()
{
int a[10], n;
int i;
printf("enter number of elements you want in array");
scanf("%d", &n);
printf("enter elements");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int largest1 = a[0],largest2 = a[0];
for (i = 0; i < n; i++)
{
if (a[i] > largest1)
{
largest2=largest1;
largest1 = a[i];
}
}
printf("First and second largest number is %d and %d ", largest1, largest2);
}
希望此代码对您有用。
享受编码:)
在不使用任何字符串函数的情况下找到第二大数字:
int array[];//Input array
int firstLargest, secondLargest;
int minNumber = -1;//whatever smallest you want to add here
/*There should be more than two elements*/
if (array_size < 2)
{
printf("Array is too small");
return;
}
firstLargest = secondLargest = minNumber;
for (index = 0; index < array_size ; ++index)
{
//Largest number check
if (array[index] > first)
{
secondLargest = firstLargest;
firstLargest = array[index];
}
//It may not larger than first but can be larger than second number
else if (array[index] > secondLargest && array[index] != firstLargest)
{
secondLargest = array[index];
}
//Finally you got your answer
if (secondLargest == minNumber)
{
printf("No Second largest number");
}
else
{
printf("Second Largest Number is %d", secondLargest);
}
这是一个带有单个循环的答案。
int array[] = { 10, 15, 13, 20, 21, 8, 6, 7, 9, 21, 23 };
const int count = sizeof(a) / sizeof(a[0]);
int lastMaxNumber = 0;
int maxNumber = 0;
for (int i = 0; i < count; i++) {
// Current number
int num = array[i];
// Find the minimum and maximum from (num, max)
int maxValue = (num > maxNumber) ? num : maxNumber;
int minValue = (num < maxNumber) ? num : maxNumber;
// If minValue is greater than lastMaxNumber, update the lastMaxNumber
if minValue > lastMaxNumber {
lastMaxNumber = minValue;
}
// Updating maxNumber
maxNumber = maxValue;
}
printf("%d", lastMaxNumber);
如果您需要在现有数组中找到最大和第二大元素,请参见上面的答案(Schwern的答案包含我将使用的方法)。
但是;需要在现有阵列中找到最大和第二大元素通常表示设计缺陷。整个阵列不会神奇地出现 - 它们来自某个地方,这意味着最有效的方法是在创建阵列时跟踪"当前最大和当前第二大"。
例如;对于您的原始代码,数据来自用户;通过跟踪"用户输入的最大和第二大值"在循环中获取值的循环内部,跟踪信息的开销将被等待用户按下键/s所花费的时间隐藏,您用户在等待结果时不再需要进行搜索,而您完全不需要数组。
是这样:
int main() {
int largest1 = 0, largest2 = 0, i, temp;
printf("enter number of elements you want in array");
scanf("%d", &n);
printf("enter elements");
for (i = 0; i < n; i++) {
scanf("%d", &temp);
if(temp >= largest1) {
largest2 = largest1;
largest1 = temp;
} else if(temp > largest2) {
largest2 = temp;
}
}
printf("First and second largest number is %d and %d ", largest1, largest2);
}
尝试一下:
firstMax = arr[0];
for (int i = 0; i<n; i++) {
if (firstMax < arr[i] ) {
secondMax = firstMax;
firstMax = arr[i];
}
}
尽管可以在一次扫描中进行,但是要纠正您自己的代码,但您必须将最大的2声明为int.min。
#include<stdio.h>
int main()
{
int a[10];
int i,b,c;
printf("Enter ten values : n");
for(i=0; i<10; i++)
{
scanf("%d",&a[i]);
}
b=a[0];
for(i=0; i<10; i++)
{
if(a[i]>b)
{
b=a[i];
}
else
{
b=b;
}
}
if(b==a[1])
{
c=a[2];
}
else
{
c=a[1];
}
for(i=0; i<10; i++)
{
if(a[i]>c && a[i]!=b)
{
c=a[i];
}
else if (b>c)
{
c=c;
}
}
printf("Largest number is %dnSecond largest number is %d",b,c);
}
如果您需要在数组中找到最大或最小的元素种类。Bubble Sort在每次通过时最终转移最大元素的简单概念(如果顺序增加)。由于您需要数组中的第一大元素和第二大元素,因此2个气泡排序可以解决问题。最后一个元素将是最大的,第二个要素将是第二大元素。我为您提供了可以帮助您理解泡沫排序概念的链接。
http://www.codeido.com/2010/10/bubblesort-witritten-in-c-with-example-sample-step-by-step/
希望它有帮助!