【简单算法】回文数(C语言)

概述

注水博客,期末emo加摆烂,想做做简单算法抚慰心灵:

题目描述

9.回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

-231 <= x <= 231 - 1

解题思路

暴力解题:回文数判断时,一半的数字是要调换顺序来比较的,所以想到了先进后出的栈。先判断数字位数length,确定栈的大小为length/2,如果是奇数个数字(length%2!=0),跳过最中间数字。最后别忘了,负数直接判错。

代码

    /*大致思路*/
    //算出数字位数
    //用一个栈来存储判断一半的数字
bool isPalindrome(int x){

    if(x < 0) return false;//为负数直接判错

    int idx = 0;//循环控制变量
    int temp = x;//临时变量
    int length = 0;//数字位数
    int top = 0;//栈顶指针
    int stack[31] = {};

    // 判断长度
    for(idx = 0;idx < 31;++idx){
    //提示给出次方不超过31
    if(temp > 0) ++length;
    temp/=10;

    }

    // 入栈
    for(top = 0;top < length / 2;++top){
        
        stack[top] = x%10;//取末尾的数入栈
        x/=10;

    }

    // 比较
    if(length%2==1){x/=10;}//如果位数是奇数,跳过判断中间的数字
    for(top = length / 2 - 1;top > -1;--top){
        
        if(stack[top]!=x%10){return false;}
        x /= 10;
    }
    
    return true;
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-number

### C语言实现回文数判断 在C语言中,可以通过多种方式来判断一个数或者字符串是否为回文。下面提供了一个基于字符数组处理的方法[^2]: ```c #include<stdio.h> #include<string.h> int main() { int i, j; char str[80]; printf("请输入字符串:\n"); scanf("%s", str); for (i = 0, j = strlen(str) - 1; i < j; i++, j--) { if (str[i] != str[j]) break; } if (i < j) printf("%s不是回文\n", str); else printf("%s是回文\n", str); return 0; } ``` 对于整数类型的回文检测,则可以采用不同的逻辑结构[^3]: ```c void checkPalindrome(int num){ int originalNum=num,temp=0; while(num>0){ temp=temp*10+(num%10); num/=10; } if(temp==originalNum) printf("yes\n"); else printf("no\n"); } ``` 上述代码通过反转输入的数值并与原值比较来进行判定。 当涉及到更复杂的场景比如寻找特定条件下的回文数时,可能还需要引入额外的概念如素数验证等操作[^4]。此时需要注意调整循环边界以及优化算法效率以确保正确性和性能表现。 #### 关于回文平方数的例子 为了找到既是完全平方又是回文性质的特殊数字,在原有基础上增加了求解平方根的过程并进行了适当修改: ```c #include<math.h> // 判断是否为素数函数... for(long long i=2;i<=sqrt(x);++i){ /*...*/} // 主体部分保持不变... if(isPrime(sqrt(n)) && isPalindrome(to_string(pow((long)sqrt(n),2)))){/*输出符合条件的结果*/} ``` 这里的关键在于合理运用数学库中的`sqrt()`函数计算开方,并结合之前提到过的回文检验方法完成最终筛选工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YUMIAKIRA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值