美文网首页
A1024 Palindromic Number (25分)

A1024 Palindromic Number (25分)

作者: km15 | 来源:发表于2020-02-14 18:25 被阅读0次

/*
题意:
1、给出一个数,10的10次方(大整数无疑)和步骤
2、找出对称数, 怎么操作呢
反转,加上原来那个,如果不是,再接着反转加上原来那个

3、如果在step之内能得到对称数,则返回,输出对称数和步骤
如果不能得到对称数,则输出数和步骤

解题:
1、 有一个反转函数
2、有一个判断对称函数
3、需要结构体,转化函数,大整数加法,输出

输入一个数,加一个步骤
再步骤内
1、先反转函数,再相加,同时判断是否对称,是则break
2、不是则一直做下去,直接条件不满足,推出

learn && worng:
1、相加,temp赋值给c,注意下标呀
2、倒置函数,有一个algorithm下有一个reverse函数,不用自己写
3、核心代码段不错
创建一个变量,每次现将当前的逆置给新变量,
再将原来与新数用大整数相加,赋值给原数
操作+1
4、
*/

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1000;

//结构体 
struct bign {
    int d[maxn];
    int len;
    bign() {
        memset(d, 0, sizeof(d));
        len = 0;
    }
};

//转化 
bign change(char str[]) {
    bign c;
    c.len = strlen(str);
    for (int i = 0;i < c.len;++i) {
        c.d[i] = str[c.len - i - 1] - '0';
    }
    return c;
}

//加法
bign add(bign a, bign b) {
    bign c;
    int carry = 0;
    for (int i = 0;i < a.len || i < b.len;++i) {
        int temp = a.d[i] + b.d[i] + carry; 
        c.d[c.len++] = temp % 10;   //!!!
        carry = temp / 10;
    }
    if (carry != 0) {
        c.d[c.len++] = carry;
    }
    return c;
}

//判断函数
bool ispada(bign a) {
    int len = a.len / 2;
    for (int i = 0;i <= len;++i) {  //!!!这里是小于等于2 
        if (a.d[i] != a.d[a.len - i - 1])
            return false;
    }
    return true;
}

//输出函数
void print(bign a) {
    for (int i = a.len - 1;i >= 0;--i) {
        cout << a.d[i];
    }
    cout << endl;
}

char str[maxn];
int main(int argc, char** argv) {
    int step;
    cin >> str >> step;
    bign a = change(str);   //转为大整数
    int k = 0;  //计数步骤 

    while (k < step && ispada(a) == false) {    //!!!这里处理的不好 
        bign b = a;
        reverse(b.d, b.d + b.len);  //将B倒置
        a = add(a, b);
        k++;
    }

    print(a);
    cout << k << endl;
    return 0;
}

相关文章

网友评论

      本文标题:A1024 Palindromic Number (25分)

      本文链接:https://www.haomeiwen.com/subject/uicjfhtx.html