1. 程式人生 > >LeetCode:第9題 迴文數 C語言實現

LeetCode:第9題 迴文數 C語言實現

題目:

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121
輸出: true

示例 2:

輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。

示例 3:

輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。

分析:

(1)本題難點主要是判斷正數x的位數,

錯誤:首先我是用  (x/i)%10 == 0; i *= 10  判斷x的位數,

錯誤原因:我認為只有最高位這個值為0,但是卻忽視了正常位數中有0的情況(如250)。

(2)判斷好x的位數之後,需要將x每一位的值進行儲存。但是由於事先不知道x的位數,所以沒有辦法定義陣列(因為長度未知),

錯誤:我定義了一個指標int *p = NULL;  然後後面直接開始用 p[i] = ...; 發生了錯誤

錯誤原因:沒有進行動態分配空間,所有造成了非法記憶體訪問。

(3)進行陣列元素的比較判斷,正數都沒有問題,但是負數出現了問題

解決辦法:加入了判斷語句,只要是x<0, 直接返回0

經驗:

1.如何判斷一個數的位數?  

思路:因為c語言中整數除以整數等於整數,所以一個數除以10就少一位,所以求一個數的位數可以依次除10操作,直到其位0,每除10該數的位數加1。

int a; int count =0;  //用來計算位數 while(a) {     a = a/10;     count++; }

2.如何表示次冪? 用pow()函式

VC6.0中原型為double pow( double x, double y );

功能:計算x的y次冪。

返回值:x不能為負數且y為小數,或者x為0且y小於等於0,返回冪指數的結果。

返回型別:double型,int,float會給與警告!

boolean isPalindrome(int x) {
    int i;
    int count = 0;  //表示位數
    int *p = NULL;     //每一位的數值
	int tmp = x;   //放x的複製本,這樣不會改變x的值

	if(x < 0){
		return 0;
	}
	while(tmp){
		tmp /= 10;
		count++;
	}
    
	printf("%d的位數為:%d\n", x, count);
	p = (int *)malloc(sizeof(int) * count);

    for(i = 0; i < count; i++){
		p[i] = (x /(int)pow(10,i)) % 10;
	}

    for(i = 0; i <= (count/2); i++){
        if(p[i] != p[count-i-1]){
            return 0;
        }
    }

    return 1;
}
#include<stdio.h>
#include<math.h>
#include<malloc.h>

typedef unsigned char  boolean;

#define  true 1
#define false 0

boolean isPalindrome(int x) {
    int i;
    int count = 0;  //表示位數
    int *p = NULL;     //每一位的數值
	int tmp = x;   //放x的複製本,這樣不會改變x的值

	if(x < 0){
		return 0;
	}
	while(tmp){
		tmp /= 10;
		count++;
	}
    
	printf("%d的位數為:%d\n", x, count);
	p = (int *)malloc(sizeof(int) * count);

    for(i = 0; i < count; i++){
		p[i] = (x /(int)pow(10,i)) % 10;
	}

    for(i = 0; i <= (count/2); i++){
        if(p[i] != p[count-i-1]){
            return 0;
        }
    }

    return 1;
}


void main(void){
	int x = -121;
	boolean y;

	y = isPalindrome(x) ;
	printf("%d是否屬於迴文數(1表示是,0表示不是):%d\n", x, y);
}