2016-11-13 26 views
1

我需要找到所有小於或等於我的輸入數字的總和(它要求它們在基數10和2中都是迴文式的)。這裏是我的代碼:查找基數2和10中的迴文數並對它們進行求和

#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

你有多個公關oblems:因爲reverse未初始化

  • 功能pal10()失敗。

  • 函數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; 
} 
+0

我會記住你的建議。我計劃在未來2-3天內學習指針。任何視頻教程或一般的教程,將幫助我嗎?(我知道有大量的人有教程,但我想徵求您的意見) –

+0

@AlexBalauca:我沒有最愛,也沒有看過一個很長一段時間。理解指針的最好方法是從理解他們的朋友處獲得幫助。簡而言之,指針是一個簡單的對象,它包含另一個對象的內存地址。您可以更改其值以使其指向不同的對象。想一下地址簿:它是一組指向房屋的指針:地址簿的每個頁面都是指向實際房屋的指針(或者如果是空白的,則爲無)。您可以通過在頁面上書寫一個新地址來更改地址。其中一些地址可能也是無效的。 – chqrlie

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

和'中斷;返回0;'是錯的。 – BLUEPIXY

+0

現在工作好了,我已經改變了它。也只是爲了確保我明白,我應該刪除「休息」;因爲如果我使用返回0,我仍然打破循環,對吧? –

+0

@AlexBalauca是的,你是對的。 –

相關問題