我需要找到所有小于或等于我输入的数字的和(它要求它们在基数10和2中都是回文)。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int pal10(int n) {
    int reverse, x;
    x = n;
    while (n != 0) {
        reverse = reverse * 10 + n % 10;
        n = n / 10;
    }
    if (reverse == x)
        return 1;
    else
        return 0;
}

int length(int n) {
    int l = 0;
    while (n != 0) {
        n = n / 2;
        l++;
    }
    return l;
}

int binarypal(int n) {
    int v[length(n)], i = 0, j = length(n);
    while (n != 0) {
        v[i] = n % 2;
        n = n / 2;
        i++;
    }
    for (i = 0; i <= length(n); i++) {
        if (v[i] == v[j]) {
            j--;
        } else {
            break;
            return 0;
        }
    }
    return 1;
}

int main() {
    long s = 0;
    int n;

    printf("Input your number \n");
    scanf("%d", &n);

    while (n != 0) {
        if (binarypal(n) == 1 && pal10(n) == 1)
            s = s + n;
        n--;
    }
    printf("Your sum is %ld", s);
    return 0;
}

它总是返回0。我猜我在binarypal函数中做错了什么。我该怎么办?

最佳答案

您有多个问题:
函数pal10()失败,因为reverse未初始化。
函数binarypal()太复杂,应该使用与pal10()相同的方法。
您应该避免将布尔函数返回值与1进行比较,C中的约定是返回0表示false,非零表示true。
您应该避免对变量名使用l,因为它看起来与大多数等宽字体上的1非常相似。事实上,它与原来的信使打字机字体是相同的字形。
下面是一个带有多基函数的简化和修正版本:

#include <stdio.h>
#include <stdlib.h>

int ispal(int n, int base) {
    int reverse = 0, x = n;

    while (n > 0) {
        reverse = reverse * base + n % base;
        n = n / base;
    }
    return reverse == x;
}

int main(void) {
    long s = 0;
    int n = 0;

    printf("Input your number:\n");
    scanf("%d", &n);

    while (n > 0) {
        if (ispal(n, 10) && ispal(n, 2))
            s += n;
        n--;
    }
    printf("Your sum is %ld\n", s);
    return 0;
}

关于c - 查找以2为底数和以10为底的回文数,并将其求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40577599/

10-09 02:10