查找长度为5的数组中的最大数字

时间:2016-09-11 19:56:27

标签: c++

这应该非常简单,但我已经习惯了更高级别的语言并且缺少某些东西。我只是想确保输入的数字是五个数字,然后找到最高的数字。不幸的是,第二部分出了问题。

#include <iostream>
#include <string>

bool isFiveDigits(int num) {
    if (std::to_string(num).length() == 5) {
        return true;
    } else {
        return false;
    }
}

int highestInArr(int *nums) {
    int highest = nums[0];
    for (int i = 1; i < sizeof(nums); i++) {
        int temp = nums[i];
        if (temp > highest) {
            highest = temp;
        }
    }
    return highest;
}

int main() {
    using namespace std;
    int num;
    int nums [5];
    cout << "Enter a five digit number!\n";
    cin >> num;
    if (!isFiveDigits(num)) {
        cout << "Not five digits, can you even count?";
        return 1;
    }
    string numstr = to_string(num);
    for (int i = 0; i < numstr.length(); i++) {
        cout << numstr[i] << "   ";
        nums[i] = (int)numstr[i];
    }
    cout << "\n" << highestInArr(nums);
}

当这个运行时,我得到:

Enter a five digit number!
12345
1   2   3   4   5   
1424080487

当然,1,424,080,487不在[1, 2, 3, 4, 5]

2 个答案:

答案 0 :(得分:2)

您不能将指针传递给函数并在不扣除模板的情况下获取其大小。在运行时,所有接收的函数都是指针。当您调用sizeof(nums)时,您没有获得原始数组的大小。您只需获取指针的大小,这与说sizeof(int_ptr)相同。相反,在使用大小为动态的集合时,您应该使用std::vector

现在,您可以通过执行以下操作来获得大小:

#include <iostream>

template<typename num_t, size_t N>
num_t max_num(num_t(&arr)[N]) {
    num_t m = (num_t)0;
    for (size_t i = 0; i < N; ++i)
        if (arr[i] > m)
            m = arr[i];
    return m;
}

int main(){
    int foo[] = { 1, 5, 2, 4, 3 };
    int m = max_num(foo);
    std::cout << m << std::endl;
    std::cin.get();
    return 0;
}

但是,这不一定是首选,并假设阵列是在调用者的堆栈上创建的。它不适用于使用new[]创建的动态分配的数组。如果您使用不同的大小多次执行此操作,您将拥有相同功能的多个实现(这是模板的功能)。使用std::array<int, N>也是如此。如果您使用N作为size_t模板参数,它将执行相同的操作。

有两个首选方案:

  • 将数组的大小发送到函数中,以便调用者负责大小。
  • 使用其他容器,例如std::vector,以便被调用者负责大小。

示例:

#include <vector>
#include <iostream>
#include <algorithm>

int main(){
    std::vector<int> vec{ 1, 5, 2, 4, 3 };
    int m = *std::max_element(std::cbegin(vec), std::cend(vec));
    std::cout << m << std::endl;
    std::cin.get();
    return 0;
}

至于is_5_digits,你应该使用base-10对数函数。

#include <cmath>
// ...
int i = 12345;
size_t length = (i > 0 ? (int)log10(i) : 0) + 1;
std::cout << length << std::endl; // prints 5;

答案 1 :(得分:0)

首先,您不能简单地将char转换为int,就像(int)numstr[i]一样,假设它会返回它所包含的数字。

请参阅,如果您有一个字符'0',则表示存储了等效的ASCII,如果48则为049'1' 1}}等等。

因此,为了获得该数字(0,1,2,...,9),您需要从ASCII值中减去48

所以改变这一行:

nums[i] = (int)numstr[i];

为:

nums[i] = (int)numstr[i] - 48; // or nums[i] = (int)numstr[i] - '0';

另外,在你的highestInArr函数中,你得到一个指针作为参数,在函数中,你使用sizeof来确定数组的大小。您不能简单地这样做,sizeof将返回int*的大小,这不是数组的大小,因此您必须将size作为第二个参数传递给该函数,并在循环中使用它。

像这样:

int highestInArr(int *nums, int size) {
    // ...
    for (int i = 1; i < size; i++) {
        // ...
    }
    // ...
}