c++ - 在 C++ 中使用 pow() 时出错
问题描述
我试图解决一个函数问题,其中我必须计算数字 1 在小于 n(给定)的所有非负整数中出现的次数。
这是我的代码:
int ones(int n, int d)
{
int rounddown = n - n % pow(10, d+1);
int roundup = rounddown + pow(10, d+1);
int right = n % pow(10, d);
int dig = (n/pow(10, d)) % 10;
if(dig<1)
return rounddown/10;
else if(dig==1)
return rounddown/10 + right + 1;
else
return roundup/10;
}
int countDigitOne(int n) {
int count = 0;
string s = to_string(n);
for(int i=0;i<s.length();i++)
count+=ones(n, i);
return count;
}
但出现以下编译错误:
第 3 行:'__gnu_cxx::__promote_2::__type {aka double}' 和 'int' 类型的无效操作数到二进制 'operator%'
解决方案
主要问题是类型转换。结果pow
是double
。模运算符不适用于double
. 你需要采取fmod
。
像这样修复你的第 3 行:
int rounddown = (int)(n - fmod(n, pow(10, d +1));
因为您的值都在您的域中,所以integer
您也可以使用:
int rounddown = n - n % (int)(pow(10, d + 1));
正如其他人所建议的那样。
只是为了完整性......如果您不被迫使用算术方法,您可以char
比较:
#include<iostream>
#include<string>
using namespace std;
int countOnesInNumber(string s)
{
int res = 0;
for(int i = 0; i < s.length(); i++)
{
if(s[i] == '1')
{
res++;
}
}
return res;
}
long countOnes(int upper)
{
long result = 0;
for(int i = 0; i < upper; i++)
{
result += countOnesInNumber(std::to_string(i));
}
return result;
}
int main()
{
string in;
cout << "Please enter a number:";
cin >> in;
cout << endl;
cout << "you choose:" << in << endl;
int n = stoi(in);
cout << "there are " << countOnes(n) << " ones under " << n << endl;
cin.ignore();
cin.get();
}
还有一种更复杂的方法。数字重复每个幅度。10 岁以下有 1 个,100 岁以下 1 个有 10 次,另外还有 10 个 10...19。等等。您可以使用以下方法计算给定大小下的数量:
int exp = (int)log10(n);
int ones = exp * (int)pow(10, exp - 1);
其中n
必须是 10 的大小(例如 10、100、1000、10000 ...)。如果你擅长数学,你甚至可能会找到一个完整的封闭公式。
推荐阅读
- linux - 使用“tee”更新文件时不遵循“tail -f”
- python-3.x - 使用 unittest 为烧瓶应用程序编写单元测试
- python - 如何使用 if 和 for 循环 django 创建分页
- python - 有人可以向我解释为什么 '\n' 在与函数一起使用时不注册吗?
- selenium - Selenium Gradle - Github Actions 构建失败
- visual-studio-code - 调试时如何使用相同/现有的外部终端(会话)?
- docker - docker_compose.yml 中 restart 和 restart_policy 的区别
- azure - castorage.common.StorageInputStream : 流已经关闭
- python - 在 python 中创建具有正确内容的 json
- elasticsearch - 通过 Elastic Search 中的逗号分隔值字段获取计数数据