如果一个数字是回文,并且可以被所有数字整除

时间:2019-03-21 16:51:23

标签: c++

我遇到的问题是,在范围为 L R 的数字中,我应该检查其中两个都是 palindroms (请阅读向前和向后相同)或所有数字可除。 现在,我启动了一个运行不佳的程序,我做了一些函数,但是我遇到了一个问题,在第30行中,编译器调用了一个错误消息:

Main.cpp:30:41: error: in evaluation of 'operator%=(int, __gnu_cxx::__promote_2::__type {aka double})'
   palindrom_check %= pow(10, upper);
   ^

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

  • 输入:1 15
  • 输出:12

说明:以1到15的间隔,数字是1、2、3、4、5、6、7、8、9、11、12、15-因此输出为12。

  • 输入:303304
  • 输出: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;
}

2 个答案:

答案 0 :(得分:0)

在我看来,好像这条线:

palindrom_check %= pow(10, upper);

会很不高兴,因为pow(10,upper)double,而不是int。模运算符%对于双精度数实际上没有任何意义。您可以通过将其类型转换为整数来解决您的错误:

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

答案 1 :(得分:0)

在C ++中,定义为

的函数
bool divisible(int n) { /* … */ }

是一个函数,该函数接受被调用时作为参数传递的整数值,并返回一个boolproperly instructed compiler会(除其他事项外)抱怨,如果存在至少一条可执行的路径,该路径不会返回任何内容。

bool divisible(int n) {
    divisible_check = n;           // No need for that variable to be global.
    while (divisible_check > 0) {  // If it's 0, the loop (which isn't a loop) is not executed.
        if ( /* ... */ ) {
            // ...
            return true;
        } else {
            return false;
            break;                 // <- Useless.
        }
    }
    // And now what?
}

其他功能也是如此,可以这样实现:

bool is_divisible_by_all_of_its_digits(int n)
{
    int tmp = n;
    while (tmp > 0)
    {
        int digit = tmp % 10;
        // We want to prevent n % 0 which would cuase a floating point exception
        if ( digit == 0  ||  n % digit != 0)
        {
            return false;
        }
        tmp /= 10;         
    }
    return true;
}

返回的值可以直接在条件中使用

// ...
for (int i = L; i <= R; i++) {
    if ( is_palindrome(i)  ||  is_divisible_by_all_of_its_digits(i)) {
        result++;
    }
}