查找数组中最大数字的索引
Find indexes of max numbers in array
我有一个用 c 编写的程序可以找到数组中的第一个和第二个最大值,但我想获取这些元素的索引。这是我的代码:
#include <stdio.h>
int main(){
int max1,max2,n;
scanf("%d",&n);
int a[n],i;
int i_m1,i_m2;
i_m1 = i_m2=0;
for(i = 0;i < n;i++){
scanf("%d",&a[i]);
}
max1 = max2 = 0;
for(i = 0;i < n;i++){
if(a[i]>max1){
max1=a[i];
//i_m1++;
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
//i_m2++;
}
}
printf("%d %d\n",max1,max2);
//printf("%d %d\n",i_m1,i_m2);
for(i = 0;i < n;i++){
printf("%d ",a[i]);
}
return 0;
}
我先输入数组中元素的个数,然后再输入数组。
例如,如果我有一个数组
number of elements: 5
elements in array:
3 4 2 5 1
indexes:
0 1 2 3 4
max1=5, max2=4
i_m1=3, i_m2=1
如何获取索引 i_m1 和 i_m2?
您正在考虑如何处理 i
,注释掉的 i_m1++
和 i_m2++
.
就证明了这一点
如果 max1=a[i];
则 i_m1 = i;
和 max2
/i_m2
相同。
也是逻辑错误。
一旦找到新的 max1
,旧值应成为新的 max2
。
if(a[i]>max1){
max2 = max1; // add
max1 = a[i];
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
}
对于初学者甚至这个 if-else 语句
for(i = 0;i < n;i++){
if(a[i]>max1){
max1=a[i];
//i_m1++;
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
//i_m2++;
}
}
错了。
if if语句的条件
if(a[i]>max1){
为真,如果 max1
不等于 max2
,则在更改 max1
.[=20= 之前,还需要将 max1
分配给 max2
]
方法可以看下面的方式
if ( n < 2 )
{
i_m1 = 0;
i_m2 = 0;
}
else
{
if ( a[0] < a[1] )
{
i_m1 = 1;
i_m2 = 0;
}
else
{
i_m1 = 0;
i_m2 = 1;
}
for ( i = 2; i < n; i++ )
{
if ( a[i_m1] < a[i] )
{
if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
i_m1= i;
}
else if ( a[i_m2] < a[i] )
{
i_m2 = i;
}
}
}
printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
enum { N = 10 };
int a[N];
int n = N;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < n; i++ )
{
a[i] = rand() % N;
}
for ( int i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
// Below the algorithm for a variable length array
int i_m1 = 0, i_m2 = 0;
if ( !( n < 2 ) )
{
if ( a[0] < a[1] )
{
i_m1 = 1;
i_m2 = 0;
}
else
{
i_m1 = 0;
i_m2 = 1;
}
for ( int i = 2; i < n; i++ )
{
if ( a[i_m1] < a[i] )
{
if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
i_m1= i;
}
else if ( a[i_m2] < a[i] )
{
i_m2 = i;
}
}
}
printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );
}
它的输出可能看起来像
0 3 5 0 3 8 8 2 5 6
max1 = 8 max2 = 8
i_m1 = 5 i_m2 = 6
我有一个用 c 编写的程序可以找到数组中的第一个和第二个最大值,但我想获取这些元素的索引。这是我的代码:
#include <stdio.h>
int main(){
int max1,max2,n;
scanf("%d",&n);
int a[n],i;
int i_m1,i_m2;
i_m1 = i_m2=0;
for(i = 0;i < n;i++){
scanf("%d",&a[i]);
}
max1 = max2 = 0;
for(i = 0;i < n;i++){
if(a[i]>max1){
max1=a[i];
//i_m1++;
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
//i_m2++;
}
}
printf("%d %d\n",max1,max2);
//printf("%d %d\n",i_m1,i_m2);
for(i = 0;i < n;i++){
printf("%d ",a[i]);
}
return 0;
}
我先输入数组中元素的个数,然后再输入数组。
例如,如果我有一个数组
number of elements: 5
elements in array:
3 4 2 5 1
indexes:
0 1 2 3 4
max1=5, max2=4
i_m1=3, i_m2=1
如何获取索引 i_m1 和 i_m2?
您正在考虑如何处理 i
,注释掉的 i_m1++
和 i_m2++
.
如果 max1=a[i];
则 i_m1 = i;
和 max2
/i_m2
相同。
也是逻辑错误。
一旦找到新的 max1
,旧值应成为新的 max2
。
if(a[i]>max1){
max2 = max1; // add
max1 = a[i];
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
}
对于初学者甚至这个 if-else 语句
for(i = 0;i < n;i++){
if(a[i]>max1){
max1=a[i];
//i_m1++;
} else if(a[i]>max2 && a[i]<max1){
max2=a[i];
//i_m2++;
}
}
错了。
if if语句的条件
if(a[i]>max1){
为真,如果 max1
不等于 max2
,则在更改 max1
.[=20= 之前,还需要将 max1
分配给 max2
]
方法可以看下面的方式
if ( n < 2 )
{
i_m1 = 0;
i_m2 = 0;
}
else
{
if ( a[0] < a[1] )
{
i_m1 = 1;
i_m2 = 0;
}
else
{
i_m1 = 0;
i_m2 = 1;
}
for ( i = 2; i < n; i++ )
{
if ( a[i_m1] < a[i] )
{
if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
i_m1= i;
}
else if ( a[i_m2] < a[i] )
{
i_m2 = i;
}
}
}
printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
enum { N = 10 };
int a[N];
int n = N;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < n; i++ )
{
a[i] = rand() % N;
}
for ( int i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
// Below the algorithm for a variable length array
int i_m1 = 0, i_m2 = 0;
if ( !( n < 2 ) )
{
if ( a[0] < a[1] )
{
i_m1 = 1;
i_m2 = 0;
}
else
{
i_m1 = 0;
i_m2 = 1;
}
for ( int i = 2; i < n; i++ )
{
if ( a[i_m1] < a[i] )
{
if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
i_m1= i;
}
else if ( a[i_m2] < a[i] )
{
i_m2 = i;
}
}
}
printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );
}
它的输出可能看起来像
0 3 5 0 3 8 8 2 5 6
max1 = 8 max2 = 8
i_m1 = 5 i_m2 = 6