首页 > 代码库 > hdu_1282 回文数猜想

hdu_1282 回文数猜想

(最近水题刷的比较多,不过还是有些收获,所以还是做个记录比较好)

http://acm.hdu.edu.cn/showproblem.php?pid=1282


分析:

       题目理解起来还是简单的,基本上有两种思路:1) 将int转为string来实现; 2)直接用int做(回文串判断,相加)

      第二中思路比较直接,将一个数倒置得到新的数,然后判断是否是回文数(两个数值相等);不过鄙人采用了第一种方法,因为字符串的操作不太熟练,需要联系来着。

     

       字符串操作:

       string -->  int

                int a;

                string str="123";

                a=atoi(str.c_str());   //头文件 stdlib.h


      int  -->  string

              int   a;

              string   str;

              stringstream ss;        //头文件  sstream.h

              ss<<a;

              ss>>str;


      字符串转置

             string str="123";

            reverse( str.begin(), str.end() );          //  algorithm.h

            cout<<str<<endl;                                 //输出321

 


代码:

//hdu 1282
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAXN 10000


int cnt;
string s[MAXN];


bool palindrome(string e)
{
    for(int i=0,j=e.length()-1;i<e.length();i++,j--){
        if(e[i]!=e[j]) return false;
    }
    return true;
}


void show()
{
    cout<<cnt-1<<endl;
    for(int i=0;i<cnt-1;i++)
        cout<<s[i]<<"--->";
    cout<<s[cnt-1]<<endl;
}


void deal(string e)
{
    int a;
    string x=e;
    while(1){
        s[cnt++]=x;
        a=atoi(x.c_str());
        reverse(x.begin(),x.end());
        a +=atoi(x.c_str());  //123+321
        stringstream ss;
        ss<<a; ss>>x;
        if(palindrome(x)) {
           s[cnt++]=x;
            break;
        }
    }
    show();
}


int main()
{
    freopen("in.txt","r",stdin);
    string str;
    while(cin>>str){
        if(palindrome(str)){
            cout<<0<<endl<<str<<endl;
            continue;
        }
        cnt=0;
        deal(str);
    }
    return 0;
}