KevinHu 发表于 2020-5-27 20:42:54

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:} 订阅传送门

(来源:洛谷)

Mr、渐行渐远 发表于 2020-5-27 20:42:55

这题要模拟高精度加法,先把输入的数字按位正序和逆序存放在两个数组里,然后写一个模拟列竖式的加法函数和一个判断回文的函数,循环下去就行
#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:27:53

本帖最后由 xiaosi4081 于 2020-5-28 07:30 编辑

沙发{:10_256:}
还有,这应该是4{:10_245:}

KevinHu 发表于 2020-5-28 07:55:09

xiaosi4081 发表于 2020-5-28 07:27
沙发
还有,这应该是4

{:10_247:}我改一下……

KevinHu 发表于 2020-5-28 08:14:48

xiaosi4081 发表于 2020-5-28 07:27
沙发
还有,这应该是4

为什么我改完标题以后还是第3期{:10_245:}

405794672 发表于 2020-5-29 11:42:32

回文数还讲进制。回文数题在C语言经典例题里有。前两天刚做了。就不重复了。

xiaosi4081 发表于 2020-5-30 15:33:05

没人了?顶
页: [1]
查看完整版本: C语言小练习-第3期