获取一个整数的最近对称数

先获得比当前数小的最近对称数,再获得比当前数大的最近对称数

在比较这两个对称数哪个最近,同样近则输出两个。

代码如下:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int strToInt(string str)
{   
    int ret = 0;
    int j = 1; 
    for (int i = str.size()-1; i>=0; i--)
    {   
        ret += (str[i]-48)*j;
        j *= 10;
    }
    return ret;
}

//获取整形的基数
int getBase(int val)
{   
    int radix = 1;
    int base = 1;
    while (val / (radix *= 10) )
    {   
        ++base;
    }
    return base;
}

string intToStr(int val)
{   
    string str;
    int base = getBase(val);
    int radix = 1;
    for (int i = 1; i< base; ++i)
    {   
        radix *= 10;
    }
    
    for (int i = 1; i<= base; ++i)
    {   
        str.push_back(val/radix%10 + 48);
        radix /= 10;
    }
    return str;
}
// 判断是否为对称数
int isDuichenshu(string str)
{                                                                                                                                                                                              
    for (int i = 0, j = str.size() -1; i < j; ++i, --j)
    {
        if (str[i] != str[j])
            return 0;
    }
    return 1;
}

vector<string> getDuichenshu(string str)
{
    string smallstr, bigstr;
    vector<string> vec;
    int num = strToInt(str);
    while(--num)
    {
        string s2 = intToStr(num);
        if (isDuichenshu(s2))
        {
            smallstr = s2;
            break;
        }
    }
    while (++num)
    {
        string s2 = intToStr(num);
        if (isDuichenshu(s2))
        {
            bigstr = s2;
            break;
        }
    }

    //cout << smallstr << "," << bigstr << endl;

    //取距离最近的对称数
    if (strToInt(str) - strToInt(smallstr) < strToInt(bigstr) - strToInt(str))
        vec.push_back(smallstr);
    else if (strToInt(str) - strToInt(smallstr) > strToInt(bigstr) - strToInt(str))
        vec.push_back(bigstr);
    else
    {
        vec.push_back(smallstr);
        vec.push_back(bigstr);
    }

    return vec;
}

int main()
{
    string str = "126"; 
    vector<string> vec;
    vector<string>::iterator it;
        
    vec = getDuichenshu(str);
    cout << "126的最近对称数是:" << endl;
    for (it = vec.begin(); it != vec.end(); ++it)
    {   
        if (it != vec.end() - 1)
            cout << *it << ", ";
        else
            cout << *it << endl;
    }
    str = "125";
    vec = getDuichenshu(str);
    cout << "125的最近对称数是:" << endl;
    for (it = vec.begin(); it != vec.end(); ++it)
    {
        if (it != vec.end() - 1)
            cout << *it << ", ";
        else
            cout << *it << endl; 
    }
        
    str = "127";
    vec = getDuichenshu(str);
    cout << "127的最近对称数是:" << endl;
    for (it = vec.begin(); it != vec.end(); ++it)
    {
        if (it != vec.end() - 1)
            cout << *it << ", ";
        else
            cout << *it << endl;
    }   
            
    return 0;
}

程序输出:


126的最近对称数是:
121, 131
125的最近对称数是:
121
127的最近对称数是:
131
 
喜欢 0
分享