题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 示例 2: 示例 3: |
分析:(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 ); 头文件:math.h 功能:计算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);
}