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.如何判断一个数的位数?  

https://zhidao.baidu.com/question/407854988.html?qbl=relate_question_5&word=%C8%E7%BA%CE%C8%B7%B6%A8%D2%BB%B8%F6%D5%FB%CA%FD%B5%C4%CE%BB%CA%FD

思路:因为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 );

头文件: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);
}

猜你喜欢

转载自blog.csdn.net/weixin_42072280/article/details/83415116