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

问题描述 投票:1回答:2

我有一个问题,在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。

  • 输入: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;
}
c++
2个回答
0
投票

它看起来好像这一行:

palindrom_check %= pow(10, upper);

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

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

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++;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.