【C++ 算法优化-判断回文数(回文字符串)】

//之前发过的法一

#include<iostream>
int is_palin(int n);
using namespace std;
int main(){
    int n,k;
    cin>>n;
    while(n--){
        cin>>k;
        if(is_palin(k)){
            cout<<"yes"<<endl;
        }
        else{
            cout<<"no"<<endl;
        }
    }
    return 0;
}
 
 
int is_palin(int n){
    long int n1,n2;    //考虑数字颠倒后的溢出问题,使用用字节数更大的long int型即可 
    if(n<0){           //我们应该要优先考虑临界情况,比如所有负数都不可能是回文数 
        return 0;
    }
    for(n1=n,n2=0;n1!=0;n1/=10){  //抹去n1的个位,即n1全体右移 
        n2=10*n2+n1%10;    //将此时n1的个位接到n2的后面 
    }
/*    if(n2%10==0){  //这一段代码其实可以不用加,因为按照前面for循环的算法,n2的个位不可能是0
                     就是前面for循环的条件不是n1不等于0吗,然后执行n2的赋值语句再将n1的个位加到n2里
                     然后最后一次循环将n1的非0值加到了n2的末尾,所以这个if条件是不会触发的 
        n2/=10;
    }   */
    if(n2==n) return 1;
    else return 0;
}

//算法优化,但是为毛这个优化过之后提交到lc上运行时间和内存消耗都变大了啊

#include<iostream>
bool is_palin(int k);
using namespace std;
int main(){
    int n;
    cin>>n;
    while(n--){
        int k;
        cin>>k;
        if(is_palin(k)==1){
            cout<<"yes"<<endl;
        }
        else{
            cout<<"no"<<endl;
        }
    }
    return 0;
} 
bool is_palin(int k){
    if(k<0||k%10==0&&k!=0){   //先处理临界条件,所有负数和个位是0的数都不可能是回文数 
        return false;
    }
    int num;
    for(num=0;num<k;k/=10){  //由于整个过程中不断的将原始数据除以10,
                             //给反转后的数字乘上10,所以当反转后的数大于原始数据时,
                                //就代表我们已经处理了一半位数的数了 
        num=num*10+k%10;
    }
    if(num==k||num/10==k){   //判断结果要包括奇数位数及偶数位数 
        return true;
    }
    else return false;
}

//字符串在下面

(42条消息) 【判断回文数(回文字符串)的两种方法】_凰宸炒家的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值