接收数字和数字的算法并检查数字内部数字的次数
algorithm that receives a number and a digit and checks how many times the digit is inside the number
编辑:现在工作
我刚开始上大学的第一年,我们有一些作业要做。
我们被要求创建一个从用户接收数字和数字的函数,并打印该数字中的数字多少次。此外,如果数字为负或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;
}
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 将函数类成员映射到类本身内部
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 将数字转换为字母(例如:123 转换为一二三)
- 接收数字和数字的算法并检查数字内部数字的次数
- 对内部包含许多数字的结构进行排序
- 非连续内部数字表示上的位移位
- 方法在C++中存储一些数字(有关详细信息,请参阅内部)
- 数字滤波器和std::内部产品优化