接收数字和数字的算法,检查数字在数字内的次数

时间:2017-12-15 12:22:49

标签: c++ function

编辑:现在工作

我刚开始上大学的第一年,我们做了一些功课。

我们被要求创建一个从用户接收数字和数字的函数,并打印该数字在该数字中的次数。 另外,我们应该使用算法顶部提到的const整数 - 如果数字为负数则返回NEGATIVE_INPUT_NUMBER,如果数字为负数或大于9,则返回ILLEGAL_DIGIT。 我想知道我的程序出了什么问题?它不能用于某种原因。有人可以解释一下原因吗?

非常感谢

它是:

    #include <iostream>
    using namespace std;
    const int NEGATIVE_INPUT_NUMBER = -1;
    const int ILLEGAL_DIGIT = -2;
    int digitInNumber(int number, int digit);

    void main()
    {
        int digit,number;
        cout<< "Please insert a number and then a digit" << endl;
        cin>> number >>digit;
        cout << digitInNumber(number, digit) << endl;
    }
    int digitInNumber(int number,int digit)
    {
        int lastDig;
        int counter = 0;
        if (number < 0)
            return NEGATIVE_INPUT_NUMBER;
        if (digit > 9 || digit < 0)
            return ILLEGAL_DIGIT;
        while (number>0)
        {
            lastDig = number % 10;
            if (lastDig == digit)
                counter++;
            number = number / 10;
        }
        return counter;

4 个答案:

答案 0 :(得分:1)

在函数digitInNumber中,您将模数运算的结果注册为数字,同时应将其保存在另一个变量中:

int digitInNumber(int number,int digit)
{
    int counter = 0;
    int lastDigit = 0;
    if (number < 0)
        return NEGATIVE_INPUT_NUMBER;
    if (digit > 9 || digit < 1)
        return ILLEGAL_DIGIT;
    while (number>0)
    {
        lastDigit = number % 10;
        if (lastDigit == digit)
            counter++;
        number = number / 10;
    }
    return counter;
}

你的版本是&#34;忘记&#34;第一次循环迭代后的数字值。

答案 1 :(得分:1)

这句话错了:

number = number % 10;

它会将number的值更改为您不想要的内容。引入临时局部变量tempint并改为使用它:

tempint = number % 10;
if (tempint == digit) {
    counter++;
}

或者只是删除该语句并将if条件修改为:

if (number % 10 == digit) {
    counter++;
}

替代方法是将整数转换为字符串,将整数转换为char并使用std::count函数:

int digitInNumber(int no, int dig) {
    std::cout << "Enter number and a digit: ";
    std::cin >> no >> dig;
    std::string number = std::to_string(no);
    char digit = dig + '0';
    int num_items1 = std::count(number.begin(), number.end(), digit);
    return num_items1;
}

答案 2 :(得分:0)

对于根据C ++标准的初学者,没有参数的函数main应声明为

int main()
  

ILLEGAL_DIGIT,以防数字为负数或超过9

此if语句中的条件不满足要求。

    if (digit > 9 || digit < 1)
        return ILLEGAL_DIGIT;

例如考虑像

这样的调用
digitInNumber( 1010, 0 );

每个变量都应在使用它的范围内声明。变量

int lastDig;

未在函数digitInNumber的外部范围内使用。

不要将幻数用作10.使用命名常量。

该功能可以按以下方式查看。

int digitInNumber(int number, int digit)
{
    const int Base = 10;

    if (number < 0)
    {
        return NEGATIVE_INPUT_NUMBER;
    }

    if (digit >= Base || digit < 0)
    {
        return ILLEGAL_DIGIT;
    }

    int counter = 0;

    do
    {
        counter += number % Base == digit;
    } while (number /= Base);

    return counter;
}

或者更通用的写函数方法是再添加一个参数。

这是一个示范程序

#include <iostream>

const int NEGATIVE_INPUT_NUMBER = -1;
const int ILLEGAL_DIGIT = -2;

int digitInNumber(int number, int digit, int base = 10)
{
    const int DEFAULT_BASE = 10;
    const int MINIMUM_BASE = 2;
    const int MAXIMUM_BASE = 16;

    if (base < MINIMUM_BASE or base > MAXIMUM_BASE) base = DEFAULT_BASE;

    if (number < 0)
    {
        return NEGATIVE_INPUT_NUMBER;
    }

    if (digit >= base or digit < 0)
    {
        return ILLEGAL_DIGIT;
    }

    int counter = 0;

    do
    {
        counter += number % base == digit;
    } while (number /= base);

    return counter;
}


int main()
{
    std::cout << digitInNumber(0, 0) << std::endl;
    std::cout << digitInNumber(10, 0) << std::endl;
    std::cout << digitInNumber(1010, 0) << std::endl;
    std::cout << digitInNumber(0xff, 0xf, 16) << std::endl;

    return 0;
}

它的输出是

1
1
2
2

注意这个电话

std::cout << digitInNumber(0xff, 0xf, 16) << std::endl;

答案 3 :(得分:0)

或者,简单的c ++

#include <iostream>
#include <string>
#include <algorithm>

// returns the number of occurrences of 'c' in 's'
size_t count_occurrences(const std::string& s, char c)
{
    size_t n = 0;
    for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
    {
        if (*it == c)
            ++n;
    }
    return n;
}

bool validate_number(const std::string& s)
{
    return s.length() && s.find_first_not_of("0123456789") == std::string::npos;
}

bool validate_digit(const std::string& s)
{
    return s.length() == 1 && isdigit(s[0]);
}

int  main()
{
    std::string number, s;
    char digit = 0;

    for(;;)
    {
        std::cout<< "Please insert a number: ";
        std::cin >> number;

        if (validate_number(number))
            break;

        std::cout<< "Invalid entry! Please try again.\n";
    }

    for (;;)
    {
        std::cout<< "Please insert a digit to look for: ";
        std::cin >> s;

        if (validate_digit(s))
        {
            digit = s[0];
            break;
        }

        std::cout<< "Invalid entry! Please try again.\n";
    }

    std::cout << "Count: " << count_occurrences(number, digit) << endl;
    return 0;
}