【C语言】[NOIP1999]回文数

文章目录


题目

[NOIP1999]回文数 链接: link

思路

因为至多可能会进行30次加法,所以最终的数字长度很有可能会超过int类型的最大范围,导致溢出,所以我们采用数组的方式记录数字。

c 复制代码
int n;
scanf("%d", &n);//读取进制
char m[200] = { 0 };//因为之多会进行30次循环,所以,最后数字的大小可能会很大,所以我们可以通过创建一个足够长的数组来存储
scanf("%s", &m);//读取回文数

这道题中判断是否进行下一次加法的一句就是当前数是否为回文数,所以我们先自定义一个可以判断是否为回文数的函数 is_huiwen(char* m) ,并且通过输出来判断是否为回文数

c 复制代码
int is_huiwen(char* m)//判断是否为回文数,是返回1,否返回0
{
	for (int i = 0; i < strlen(m); i++)
	{
		if (m[i] != m[strlen(m) - 1 - i])
			return 0;
	}
	return 1;
}

自定义 sum 函数,进行回文数相加操作

但是这个过程中有很多点需要注意

  1. 传进去是字符串的形式,我们可以利用自定义函数 ctio 转换为整形后进行加法,最后再用自定义函数 itoc 转换为字符输出
  2. 加法后的数字位数很有可能与之前不同,所以我们可以创建一个新的数组来储存加法后的数字,最后倒回去。
  3. 加法过程中存在仅为,需要提前设置 jw 来辅助
c 复制代码
int ctoi(char x)//字符转int
{
	int y = 0;
	if (x >= 'A' && x <= 'E')
	{
		y = x - 'A' + 10;
	}
	if (x >= '0' && x <= '9')
	{
		y = x - '0';
	}
	return y;
}
char itoc(int x)//int转字符
{
	char y;
	if (x < 10) y = x + '0';
	else y = x - 10 + 'A';
	return y;
}

void sum(char* m,int n)//计算x进制加法,把结果覆盖到m数组中
{
	char sum[200] = { 0 };//sum记录顺序最左边为个位.
	int len = strlen(m), i, jw = 0;//使用jw来记录进位情况
	for (i = 0; i < len; i++)
	{
		int x, y;
		x = ctoi(m[i]);
		y = ctoi(m[len - i - 1]);
		int s = x + y;
		sum[i] = itoc((s + jw) % n);
		jw = (s + jw) / n;
	}
	if (jw != 0) sum[i] = itoc(jw);//最后一位进位
	len = strlen(sum);
	for (i = 0; i < len; i++)//覆盖m
	{
		m[i] = sum[len - i - 1];
	}
}

代码呈现

c 复制代码
#include<stdio.h>
#include<assert.h>
#include<string.h>





int ctoi(char x) { //字符转int
    int y = 0;
    if (x >= 'A' && x <= 'E') {
        y = x - 'A' + 10;
    }
    if (x >= '0' && x <= '9') {
        y = x - '0';
    }
    return y;
}
char itoc(int x) { //int转字符
    char y;
    if (x < 10) y = x + '0';
    else y = x - 10 + 'A';
    return y;
}


void sum(char* m, int n) { //计算x进制加法,把结果覆盖到m数组中
    char sum[200] = { 0 };//sum记录顺序最左边为个位.
    int len = strlen(m), i, jw = 0;//使用jw来记录进位情况
    for (i = 0; i < len; i++) {
        int x, y;
        x = ctoi(m[i]);
        y = ctoi(m[len - i - 1]);
        int s = x + y;
        sum[i] = itoc((s + jw) % n);
        jw = (s + jw) / n;
    }
    if (jw != 0) sum[i] = itoc(jw);//最后一位进位
    len = strlen(sum);
    for (i = 0; i < len; i++) { //覆盖m
        m[i] = sum[len - i - 1];
    }
}


int is_huiwen(char* m) { //判断是否为回文数,是返回1,否返回0
    for (int i = 0; i < strlen(m); i++) {
        if (m[i] != m[strlen(m) - 1 - i])
            return 0;
    }
    return 1;
}

int main() {
    int n;
    scanf("%d", &n);//读取进制
    char m[200] = { 0 };//因为之多会进行30次循环,所以,最后数字的大小可能会很大,所以我们可以通过创建一个足够长的数组来存储
    scanf("%s", &m);//读取回文数

    int count = 0;
    while (count < 31) {
        if (is_huiwen(
                    m)) { //判断当前是否为回文数,如果是回文数,就直接退出
            break;
        } else {
            sum(m, n);
            count++;
        }
    }
    if (count == 31)
        printf("Impossible!");
    else
        printf("STEP=%d", count);

    return 0;
}
相关推荐
浊酒南街11 分钟前
决策树python实现代码1
python·算法·决策树
冠位观测者2 小时前
【Leetcode 热题 100】208. 实现 Trie (前缀树)
数据结构·算法·leetcode
小王爱吃月亮糖3 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
就爱学编程4 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
IT猿手4 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解LRMOP1-LRMOP6及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·matlab·智能优化算法·多目标算法
落羽的落羽5 小时前
【落羽的落羽 C语言篇】动态内存管理·下
c语言
InfiSight智睿视界5 小时前
AI 技术,让洗护行业焕然「衣」新
人工智能·算法
程序员一诺5 小时前
【机器学习】嘿马机器学习(算法篇)第11篇:决策树算法,学习目标【附代码文档】
人工智能·python·算法·机器学习
Evand J6 小时前
平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题
算法
taoyong0016 小时前
代码随想录算法训练营第十五天-二叉树-110.平衡二叉树
数据结构·算法