C语言小练习-第3期
本帖最后由 KevinHu 于 2021-11-22 19:42 编辑~~欢迎来到第四期C语言小练习~~
此处引用简单植物大战僵尸制作(3)的开头(我嗅到了一股广告的气味……)
看到我的昵称
是不是以为这里是盗版的《C语言小练习》
没错,就是盗版(手滑打错了)
看看共同维护人:
没错
从今以后,我就是《C语言小练习》的共同维护人
咳咳,进入正题
这次的题目:
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 56,将 56 加 65(即把 56 从右向左读),得到 121 是一个回文数。
又如:对于十进制数 87:
STEP1:87+78=165
STEP2:165+561=726
STEP3:726+627=1353
STEP4:1353+3531=4884
在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4 步得到回文数 4884。
写一个程序,给定一个 N(2≤N≤10 或 N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出"Impossible!"。
输入输出格式
输入格式
两行,分别是 N,M。
输出格式
如果能在 30 步以内得到回文数,输出格式形如 "STEP=ans",其中 ans 为最少得到回文数的步数。
否则输出 "Impossible!"。
输入输出样例
输入:
10
87
输出:
STEP=4
如果喜欢,别忘了评分+订阅哦~{:10_281:} 订阅传送门
(来源:洛谷) 这题要模拟高精度加法,先把输入的数字按位正序和逆序存放在两个数组里,然后写一个模拟列竖式的加法函数和一个判断回文的函数,循环下去就行
#include <iostream>
#include <cstring>
using namespace std;
int toInt(char s[], int a[], int b[])
{
char *p = s;
char *q = s;
int i=0;
int len;
while(*p)
{
if(*p>='0'&&*p<='9')
a = *p-'0';
else
a = *p - 'A'+10;
i++;
p++;
}
len = i;
i--;
while(*q)
{
if(*q>='0'&&*q<='9')
b = *q-'0';
else
b = *q-'A'+10;
i--;
q++;
}
return len;
}
int add(int n, int len, int a[], int b[])
{
int i,temp;
for( i=0; i<len; i++)
{
temp = (a+b)/n;
a = (a+b)%n;
a+=temp;
}
if(a==0)
return len;
else
return len+1;
}
bool judge(int c[], int len)
{
for(int i=0; i<=len/2; i++)
if(c!=c)
return false;
return true;
}
void reverse(int lenc, int c[], int rc[])
{
for(int i=0; i<lenc; i++)
rc = c;
}
int main()
{
int a={0}, b={0},ra={0};
char s;
int n;
int step = 1;
cin>>n;
cin>>s;
int lens = toInt(s,a,b);
int lena = add(n,lens,a,b);
while(!judge(a,lena))
{
step ++;
reverse(lena,a,ra);
lena=add(n,lena,a,ra);
if(step>30)
break;
}
if(step<=30)
cout<<"STEP="<<step<<endl;
else
cout<<"Impossible!"<<endl;
return 0;
}
可能有的地方算法不够好,可以再改改{:5_109:} 本帖最后由 xiaosi4081 于 2020-5-28 07:30 编辑
沙发{:10_256:}
还有,这应该是4{:10_245:} xiaosi4081 发表于 2020-5-28 07:27
沙发
还有,这应该是4
{:10_247:}我改一下…… xiaosi4081 发表于 2020-5-28 07:27
沙发
还有,这应该是4
为什么我改完标题以后还是第3期{:10_245:} 回文数还讲进制。回文数题在C语言经典例题里有。前两天刚做了。就不重复了。 没人了?顶
页:
[1]