找到基数2和10中的回文数字并将它们相加

时间:2016-11-13 18:57:42

标签: c sum

我需要找到与我的输入数量相等或更小的所有数字的总和(它要求它们在基数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函数中做错了。我该怎么办?

2 个答案:

答案 0 :(得分:2)

您有多个问题:

  • 函数pal10()失败,因为reverse未初始化。

  • 函数binarypal()过于复杂,您应该使用与pal10()相同的方法。

  • 你应该避免将布尔函数返回值与1进行比较,C中的约定是将0返回false,将非零返回true。

  • 你应该避免使用l作为变量名,因为它在大多数恒定宽度字体上看起来与1非常相似。事实上,它与原始 Courier 打字机字体的字形相同。

这是一个带有多基函数的简化版本:

#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;
}

答案 1 :(得分:1)

在函数pal10中,变量reverse不会被初始化。

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;
}

在函数binarypal中,此循环不正确,因为具有length( n )元素的数组的索引的有效范围为[0, length( n ) - 1 ]

for(i=0;i<=length(n);i++)
{
    if(v[i]==v[j])
    {
        j--;
    }
    else
    {
        break;
        return 0;
    }
}

正如 @BLUEPIXY 指出你要从其他地方删除break语句

    else
    {
        break;
        return 0;
    }