解题思路:
根据题意我们知道实现程序的话,主要是下面函数的循环:
定义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分
6 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:611 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:690 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
打印十字图 (C语言代码)浏览:2820 |
局部变量作函数返回值的问题浏览:1028 |
C二级辅导-等差数列 (C语言代码)浏览:806 |
模拟计算器 (C语言代码)浏览:2366 |
简单的a+b (C语言代码)浏览:600 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:660 |
简单的a+b (C语言代码)浏览:617 |