[英]Is book's code to find the second largest integer in an array wrong?
這個程序應該找到第二大的 integer。 我是從一本書里拿出來的。
當我輸入在4 5 1 2 3
中查找第二大數字時,它不會選擇4
作為第二大數字。 我認為第 16 行的代碼應該是arr[0]
而不是arr[1]
。 我是正確的還是我錯過了什么?
#include <stdio.h>
int main()
{
int i, n, arr[20], large, second_large;
printf("\n Enter the number of elements in the array : ");
scanf("%d", &n);
printf("\n Enter the elements");
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
large = arr[0];
for(i=1;i<n;i++)
{
if(arr[i]>large)
large = arr[i];
}
second_large = arr[1]; // line 16
for(i=0;i<n;i++)
{
if(arr[i] != large)
{
if(arr[i]>second_large)
second_large = arr[i];
}
}
printf("\n The numbers you entered are : ");
for(i=0;i<n;i++)
printf("\t %d", arr[i]);
printf("\n The largest of these numbers is : %d",large);
printf("\n The second largest of these numbers is : %d",second_large);
return 0;
}
您的代碼讀起來像“C”,這是針對同一問題的 C++20 代碼:(對於手動輸入,使用 std::cin 和 values.push_back)
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
constexpr std::size_t second_largest_index = 1ul;
std::vector<int> values{ 0,2,8,7,5,4,1,3,9,6 };
std::ranges::nth_element(values, values.begin() + 1, std::ranges::greater());
std::cout << "the second largest value = " << values[second_largest_index];
return 0;
}
代碼本身存在一些可能導致問題的小錯誤。 一次,如您所知,數組從索引 0 開始,但在 for 循環中,您確實從 1 開始計算它。所以而不是:
for(i=1;i<n;i++)
{
if(arr[i]>large)
large = arr[i];
}
你也應該從零開始你的 for 循環,否則,你不算一個。
此外,為了更簡單,您可以這樣編寫代碼:
#include <iostream>
using namespace std;
int main(){
int n, num[50], biggest, secondBiggest;
cout<<"Enter number of elements in your array: ";
cin>>n;
for(int i=0; i<n; i++){
cout<<"Enter your "<<(i+1)<<" Number: ";
cin>>num[i];
}
if(num[0]<num[1]){
biggest= num[1];
secondBiggest= num[0];
}
else{
biggest= num[0];
secondBiggest= num[1];
}
for (int i = 2; i< n ; i ++) {
if (num[i] > biggest) {
secondBiggest= biggest;
biggest= num[i];
}
else if (num[i] > secondBiggest && num[i] != biggest) {
secondBiggest= num[i];
}
}
cout<<"Second Largest Element in array is: "<<secondBiggest;
return 0;
}
這個說法
second_large = arr[1];
立即選擇數組 { 4, 5, 1, 2, 3 } 中的最大數。
所以這個 for 循環中嵌套 if 語句的表達式
for(i=0;i<n;i++)
{
if(arr[i] != large)
{
if(arr[i]>second_large)
second_large = arr[i];
}
}
永遠不會評估為真。 即第二大數將始終等於第一大數。
請注意,通常數組可以包含所有彼此相等的元素。
我可以建議以下方法。
large = 0;
second_large = n;
i = 1;
while ( i < n && arr[i] == arr[large] ) ++i;
if ( i < n )
{
if ( arr[large] < arr[i] )
{
large = i;
second_large = 0;
}
else
{
second_large = i;
}
while ( ++i < n )
{
if ( arr[large] < arr[i] )
{
second_large = large;
large = i;
}
else if ( arr[second_large] < arr[i] )
{
second_large = i;
}
}
}
if ( second_large == n )
{
puts( "\nAll elements are equal each other." );
}
else
{
printf("\nThe largest of these numbers is : %d", arr[large] );
printf("\nThe second largest of these numbers is : %d", arr[second_large] );
}
這是一個演示 C 程序(這是一個 C 程序,因為您提供的程序實際上與 C++ 無關)
#include <stdio.h>
int main( void )
{
int arr[] = { 4, 5, 1, 2, 3 };
const size_t n = sizeof( arr ) / sizeof( *arr );
size_t large = 0;
size_t second_large = n;
size_t i = 1;
while (i < n && arr[i] == arr[large]) ++i;
if (i < n)
{
if (arr[large] < arr[i])
{
large = i;
second_large = 0;
}
else
{
second_large = i;
}
while (++i < n)
{
if (arr[large] < arr[i])
{
second_large = large;
large = i;
}
else if (arr[second_large] < arr[i])
{
second_large = i;
}
}
}
for (i = 0; i < n; i++)
{
printf( "%d ", arr[i] );
}
putchar( '\n' );
if (second_large == n)
{
puts( "All elements are equal each other." );
}
else
{
printf( "The largest of these numbers is : %d\n", arr[large] );
printf( "The second largest of these numbers is : %d\n", arr[second_large] );
}
}
程序 output 是
4 5 1 2 3
The largest of these numbers is : 5
The second largest of these numbers is : 4
一個C++演示程序可以看如下方式
#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>
int main()
{
int arr[] = { 4, 5, 1, 2, 3 };
const size_t n = sizeof( arr ) / sizeof( *arr );
auto last = std::next( arr, n );
for (auto first = std::begin( arr ); first != last; ++first)
{
std::cout << *first << ' ';
}
std::cout << '\n';
auto it = std::adjacent_find( std::begin( arr ), last,
std::not_equal_to<>() );
if (it == last)
{
std::cout << "All elements are equal each other.\n";
}
else
{
auto [second_large, large] = std::minmax( { it, std::next( it ) },
[]( const auto &it1, const auto &it2 )
{
return *it1 < *it2;
} );
for (auto current = std::next( it, 2 ); current != last; ++current)
{
if (*large < *current)
{
second_large = std::exchange( large, current );
}
else if (*second_large < *current)
{
second_large = current;
}
}
std::cout << "The largest of these numbers is "
<< *large << " that is present at position "
<< std::distance( std::begin( arr ), large )
<< '\n';
std::cout << "The second largest of these numbers is "
<< *second_large << " that is present at position "
<< std::distance( std::begin( arr ), second_large )
<< '\n';
}
}
程序 output 是
4 5 1 2 3
The largest of these numbers is 5 that is present at position 1
The second largest of these numbers is 4 that is present at position 0
這是“運行最大值”算法的實現:
#include <iostream>
int main()
{
int largest_number = 0;
std::cin >> largest_number;
int second_largest = 0;
int number = 0;
std::cin >> number;
if (number > largest_number)
{
second_largest = largest;
largest = number;
}
else
{
second_largest = number;
}
while (cin >> number)
{
if (number > largest_number)
{
second_largest = largest;
largest = number;
}
else
{
if (number > second_largest)
{
second_largest = number;
}
}
}
std::cout << "First largest: " << largest_number << "\n";
std::cout << "Second largest: " << second_largest << "\n";
}
上面的代碼在不使用數組或向量的情況下找到最大和第二大的數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.