c++ - 如果一个数字是一个回文数并且可以被它的所有数字整除
问题描述
我有一个问题,在从L到R的一系列数字中,我应该检查其中有多少是回文(向前和向后读取相同)或可被所有数字整除。现在,我启动了一个不能很好地运行的程序,我做了一些函数,但是我遇到了一个问题,在第 30行编译器调用了一个错误说:
Main.cpp:30:41:错误:在评估 'operator%=(int, __gnu_cxx::__promote_2::__type {aka double})' palindrom_check %= pow(10, 上); ^
以下是问题中给出的输入和输出示例:
- 输入:1 15
- 输出:12
解释:在 1 到 15 的区间内,数字为 1、2、3、4、5、6、7、8、9、11、12、15 - 因此输出为 12。
- 输入:303 304
- 输出:1
我很确定我没有正确使用 pow() 。我希望任何人都可以给我一种方法来继续或编辑我的代码以修复它并使其工作。
#include <iostream>
#include <cmath>
using namespace std;
int digits = 1;
int check_dig = 0;
int Digit(int n) {
digits = 1;
check_dig = n;
while (check_dig > 10) {
check_dig /= 10;
digits++;
}
}
int exponent = 1;
int front_check = 0;
int back_check = 0;
bool palindrom = false;
int palindrom_check = 0;
int upper = digits - 1;
int Palindrom(int n) {
palindrom = false;
exponent = (int)pow(10, upper);
front_check = n;
palindrom_check = n;
while (palindrom_check > 0) {
back_check += (palindrom_check % 10) * exponent;
palindrom_check %= exponent;
exponent /= 10;
}
if (back_check == front_check) {
palindrom = true;
}
}
bool divisible = false;
int divisible_check = 0;
int Divisibility(int n) {
divisible_check = n;
while (divisible_check > 0) {
if (divisible_check % (divisible_check % 10) == 0) {
divisible_check /= 10;
divisible = true;
continue;
} else {
divisible = false;
break;
}
}
}
int main() {
int L, R;
cin >> L >> R;
int result = 0;
for (int i = L; i <= R; i++) {
Digit(i);
Palindrom(i);
Divisibility(i);
if (palindrom || divisible) {
result++;
}
}
cout << result;
return 0;
}
编辑:
#include <iostream>
#include <cmath>
using namespace std;
int digits = 1;
int check_dig = 0;
void Digit(int n) {
digits = 1;
check_dig = n;
while (check_dig > 10) {
check_dig /= 10;
digits++;
}
}
int front_check = 0;
int back_check = 0;
int palindrom_check = 0;
int upper = digits - 1;
bool palindrom(int n) {
front_check = n;
back_check = 0;
palindrom_check = n;
while (palindrom_check > 0) {
back_check = (back_check * 10) + (palindrom_check % 10);
palindrom_check /= 10;
}
if (back_check == front_check) {
return true;
}
}
int divisible_check = 0;
bool divisible(int n) {
divisible_check = n;
while (divisible_check > 0) {
if (divisible_check % (divisible_check % 10) == 0) {
divisible_check /= 10;
return true;
} else {
return false;
break;
}
}
}
int main() {
int L, R;
cin >> L >> R;
int result = 0;
for (int i = L; i <= R; i++) {
Digit(i);
palindrom(i);
divisible(i);
if (palindrom || divisible) {
result++;
}
}
cout << result;
return 0;
}
解决方案
在我看来,好像这条线:
palindrom_check %= pow(10, upper);
会不高兴,因为pow(10,upper)
它是一个double
,而不是一个int
。模数运算符%
对双精度数没有真正意义。您可以通过将其类型转换为整数来修复您遇到的错误:
palindrom_check %= (int)pow(10, upper);
推荐阅读
- openstack - 来自计算端点上的获取服务器详细信息列表的不完整风味信息
- jsonschema - JSON Schema - 枚举或对象
- node.js - cipher.js TypeError: IV must be a buffer
- javascript - 对输入动态应用 JavaScript
- command-line-interface - ZAP-CLI 报告生成
- visual-studio - 如何停止 Visual Studio 2017 v15.7.2 在新浏览器窗口中打开调试会话?
- android - RadioButton 上带有文本的自定义按钮
- apache-kafka - Kafka 内置的重试机制究竟是如何工作的?
- android - 从钩子方法获取设备传感器状态
- apache-spark - 使用 Spark (1.6.0) SQL 的 Kerberos 启用远程 Hive Meta Store (hive-1.1.0) 访问问题