接收数字和数字的算法并检查数字内部数字的次数

algorithm that receives a number and a digit and checks how many times the digit is inside the number

本文关键字:数字 内部 检查 算法      更新时间:2023-10-16

编辑:现在工作

我刚开始上大学的第一年,我们有一些作业要做。

我们被要求创建一个从用户接收数字和数字的函数,并打印该数字中的数字多少次。此外,如果数字为负或ILLEGAL_DIGIT,则应该使用在我的算法 - 否和返回ligate_input_number上提到的常量整数,以防数字为负或大于9。我想知道我的程序有什么问题?它是出于某种原因无法使用的。有人可以解释我为什么吗?

非常感谢

是:

    #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;

在功能digitInNumber中,您在数字中注册了Modulo操作的结果,而应该将其保存在另一个变量中:

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;
}

您的版本是"忘记"循环第一次迭代后数字的值。

此语句是错误的:

number = number % 10;

它将number的值更改为您不需要的东西。引入临时局部变量tempint并改用:

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

或简单地删除该语句,然后将if条件修改为:

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

替代方案是将整数编号转换为字符串和整数数字,并使用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;
}

根据C 标准的起动器,应像

一样声明无参数的功能
int main()

illegal_digit如果数字为负或大于9

如果语句不满足要求。

    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;

或在平原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;
}