A1024 Palindromic Number (25分)
2020-02-14 本文已影响0人
km15
/*
题意:
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;
}