原题链接:回文数(二)
解题思路:
根据题意我们知道实现程序的话,主要是下面函数的循环:
定义cot = 0,cot是用来记录循环次数 由于(0<=M<=maxlongint)较大,我们使用数组进行储存数据,防止数据过大溢出 定义数组 store[100]; memset(store,0,sizeof store);
1.输入数据,将数据储存在数组里
2.判断是否为回文数(如果为回文数我们就跳出循环,否则进行下一步处理)
3.进行回文操作,并与原数据进行相加处理(因为我们使用的是数组进行每一位数的存储,因此我们可以先不考虑进制问题)
4.再进行进制转换处理
5.cot ++,返回第2步进行判断
注意事项:
对于大数计算方法不懂的可以看一下这一题:大数加法
下面是这一题的函数
由于 long long 的最大值:9223372036854775807
因此我们开辟100位空间绰绰有余
将数据存入数组store中
采取逆位储存,即最小位放在最前面,便于之后的进位运算
string M; cin >> N >> M; memset(store,0,sizeof store); for(int i = M.size() - 1,j = 1;i >= 0;i --,j ++)//这里是从下标为1开始 store[j] = (M[i] - '0');
else
cin >> N >> M; memset(store,0,sizeof store); int i = 1;//下标为1开始 while(M) { A[i ++] = M % 10; M /= 10; }
当我们使用数组时通常要知道其数据位数,每次相加后可能会进位,ize + 1
更新数据的位数
void up_data() { int i; for(i = 105;i >= 1;i --)//当遇到不为零的数时,即为最高位上的值 if(store[i] != 0) break; size = i; }
与回文数相加
我们只需要将原数组逆序输出即可得到回文数
可以开辟一个新的数组进行存储
store1[100];
for(int i = size;i >= 1;i --)//这时size的用处就体现出来了,将数组逆位输出 store1[n ++] = store[i]; for(int i = 1;i <= size;i ++)//再进行相加 store[i] += store1[i];
进制转换
for(int i = 1;i = N)//判断这一位是否大于N,是的话向前进一位 { store[i] -= N; store[i + 1] ++; } }
判断是否为回文数(是返回 1,否则返回 0)
int set_up() { for(int i = 1,j =size;i < j;i ++,j --) if(store[i] != store[j]) return 0; return 1; }
参考代码(成功AC):
#include #include #include using namespace std; int store[100]; int N,cot; string M; int size;//记录当前数据的位数 void up_data() { int i; for(i = 99;i >= 1;i --) if(store[i] != 0)//当查询到不为零时,正好为其最高位位数 break; size = i; } void HUIWEN()//进行回文操作相加并进行进制转换处理 { int store1[100]; int n = 1; for(int i = size;i >= 1;i --) store1[n ++] = store[i]; for(int i = 1;i <= size;i ++) store[i] += store1[i]; for(int i = 1;i = N) { store[i] -= N; store[i + 1] ++; } } up_data();//每次进行数据处理后,进行位数的更新 } int set_up() { for(int i = 1,j =size;i < j;i ++,j --) if(store[i] != store[j]) return 0; return 1; } int main() { cin >> N >> M; memset(store,0,sizeof store); for(int i = M.size() - 1,j = 1;i >= 0;i --,j ++) store[j] = (M[i] - '0'); up_data();//先更新初始位数 while(cot < 30) { if(set_up()) break;//判断是否为回文数 HUIWEN(); cot ++;//记录运行的次数 } if(cot == 30) { cout<<"Impossible!"; return 0; } cout <<"STEP="<< cot; return 0; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复