首页 > 解决方案 > 如果一个数字是一个回文数并且可以被它的所有数字整除

问题描述

我有一个问题,在从LR的一系列数字中,我应该检查其中有多少是回文(向前和向后读取相同)或可被所有数字整除。现在,我启动了一个不能很好地运行的程序,我做了一些函数,但是我遇到了一个问题,在第 30行编译器调用了一个错误说:

Main.cpp:30:41:错误:在评估 'operator%=(int, __gnu_cxx::__promote_2::__type {aka double})'
   palindrom_check %= pow(10, 上);
   ^

以下是问题中给出的输入和输出示例:

解释:在 1 到 15 的区间内,数字为 1、2、3、4、5、6、7、8、9、11、12、15 - 因此输出为 12。

我很确定我没有正确使用 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;
}

标签: c++

解决方案


在我看来,好像这条线:

palindrom_check %= pow(10, upper);

会不高兴,因为pow(10,upper)它是一个double,而不是一个int。模数运算符%对双精度数没有真正意义。您可以通过将其类型转换为整数来修复您遇到的错误:

palindrom_check %= (int)pow(10, upper);

推荐阅读