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