详解判断回文字符串和回文数算法的C语言代码!

18 篇文章 1 订阅

一、判断一个字符串是否为回文字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//包含strlen

#define YES 1
#define NO  0

#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short
#define ulong unsigned long

#define u8  uchar
#define u16 ushort
#define u32 ulong

u8 IsPalindromeString(u8 *pStr);

int main(void)
{
    u8 array[] = "abcdefgfedcba"; 
    u8 value = 0;
   
    value = IsPalindromeString(array);
    if (value)
    {
        printf("是回文字符串!\n");
    }
    else
    {
        printf("不是回文字符串!\n");  
    }

 return 0;
}

//思路:
//(1)用两个指针分别指向字符串的头和尾
//(2)比较两指针指向的字符是否相同
//(3)若相同则头指针向后移动,尾指针向前移动
//(4)若不同则返回NO,说明不是回文字符串
//(5)重复2.3.4
//(6)若头尾指针指向位置相邻或相同则返回YES,说明是回文字符串
u8 IsPalindromeString(u8 *pStr)
{
    u8 num = strlen((const char *)pStr);
    u8 *pHead = pStr;//指向字符串的头
    u8 *pTail = pStr+num-1;
   
    for (; pHead<=pTail; pHead++, pTail--)
    {
        if (*pHead != *pTail)
        {
            return NO;
        }      
        else if (pHead == pTail || pHead+1 == pTail)
        {
            return YES;
        }
 }
}

 

二、判断一个数是否为回文数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//包含strlen

#define YES 1
#define NO  0

#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short
#define ulong unsigned long

#define u8  uchar
#define u16 ushort
#define u32 ulong

u8 IsPalindromeNumber(u32 num);

int main(void)
{
    u32 num = 1221; 
    u8 value = 0;
   
    value = IsPalindromeNumber(num);
    if (value)
    {
        printf("是回文数!\n");
    }
    else
    {
        printf("不是回文数!\n");  
    }
       
    return 0;
}

/*
分析:因为回文数从高位向低位看的数值和从低位向高位看的数值是相等的。
所以:可以将数值从低位到高位进行拆分,然后再重新组合,通过判断新组合
的数值是否和原数值相等即可判断是否为回文数!
*/
u8 IsPalindromeNumber(u32 num)
{
    u32 temp = num;
    u32 sum = 0;  
   
    while (num)   
    {       
        sum = sum*10 + num%10;//将num从低位到高位依次取出然后再重新组合成一个整数        
        num /= 10;//将num去掉个位数   
    }
   
    if(sum == temp)
    {       
        return YES;
    }          
    else       
    {       
        return NO;
    } 
}

 


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值