LeetCode:第9題 迴文數 C語言實現
阿新 • • 發佈:2018-12-17
題目:判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例 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。
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);
}