当前位置: 首页 > news >正文

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。

输出格式

如果能在 3030 步以内得到回文数,输出格式形如 STEP=ans,其中 ansans 为最少得到回文数的步数。

否则输出 Impossible!

输入输出样例

输入 #1

10
87

输出 #1

STEP=4

题目来源

P1015 [NOIP1999 普及组] 回文数

思路及部分代码:

1. 将字符解析成数字

//将字符解成数字
int char_number(char c){if(c >= '0' && c <= '9')return c-'0';else if(c >= 'A' && c <= 'F')return (c - 'A' + 10); else if(c >= 'a' && c <= 'f')return (c - 'a' + 10);elsereturn 0;
}

2. 各进制加运算法

//进行进制运算      2-10 || 16   
//返回值表示是否有进位
int operation(int x,int n){int a;int i = 0;number[0] = 0;for(i =0;i < n;i++){a = number_z[i] + number_z[n-i-1] + number[i];if(a >= x){number[i] = a - x;number[i+1] = 1; }else{number[i] = a;number[i+1] = 0;}}return number[n];
}

3. 判断数字是否满足实验要求

//传入number的位数,判定是否 是 同位数
int number_pd(int n){for(int i = 0; i<n;i++){if(number[i] != number[n-i-1])  return 0;   //不满足同位数要求}return 1;
}

4. 依次计算到题目要求的结束

    while(1){//将数值传入临时保存for(int i=0; i <cnt_n; i++){number_z[i] = number[i];}//超出计算次数if(cnt > 30){printf("Impossible!\r\n");return 0;}cnt_n = cnt_n + operation(n, cnt_n);cnt++;//如果满足同位数if(number_pd(cnt_n) == 1){printf("STEP=%d\r\n", cnt);break;}}

总代码:

#include <stdio.h>
#include <string.h>char M[100];
int number_z[10000];
int number  [10000] = {0};//将字符解成数字
int char_number(char c){if(c >= '0' && c <= '9')return c-'0';else if(c >= 'A' && c <= 'F')return (c - 'A' + 10); else if(c >= 'a' && c <= 'f')return (c - 'a' + 10);elsereturn 0;
}//将数字转换成字符
/*
char number_char(int n){if(n >= 0 && n<=9)return '0'+n;else if(n >= 10 && n<=15)return ('A'+n-10);
}*///进行进制运算      2-10 || 16   
//返回值表示是否有进位
int operation(int x,int n){int a;int i = 0;number[0] = 0;for(i =0;i < n;i++){a = number_z[i] + number_z[n-i-1] + number[i];if(a >= x){number[i] = a - x;number[i+1] = 1; }else{number[i] = a;number[i+1] = 0;}}return number[n];
}//传入number的位数,判定是否 是 同位数
int number_pd(int n){for(int i = 0; i<n;i++){if(number[i] != number[n-i-1])  return 0;   //不满足同位数要求}return 1;
}int main (){int n;scanf("%d",&n);scanf("%s",M);//将接收的字符串for(int i=0;i<strlen(M);i++){number[i] = char_number(M[i]);  }int cnt_n = strlen(M);int cnt = 0;    //用于计算步数while(1){//将数值传入临时保存for(int i=0; i <cnt_n; i++){number_z[i] = number[i];}//超出计算次数if(cnt > 30){printf("Impossible!\r\n");return 0;}cnt_n = cnt_n + operation(n, cnt_n);cnt++;//如果满足同位数if(number_pd(cnt_n) == 1){printf("STEP=%d\r\n", cnt);break;}}return 0;
}

总结:

  • 代码实现了进制转换和同位数判断的功能,并且在实现过程中使用了数组、循环、条件语句等基本的编程知识。

不足之处:

  • 变量名不够直观,例如 Mnumber_znumber 等变量名不够清晰,不便于阅读和理解。
  • 函数和变量的注释不够详细,没有说明其作用、输入和输出等信息,不便于阅读和理解。
  • 在进行进制运算时,代码中使用了 number 数组来保存结果,但是没有清空该数组,可能会导致计算结果错误。

改进意见:

  • 变量名应该更加直观,例如 M 可以改为 input_stringnumber_z 可以改为 temp_numbernumber 可以改为 result_number 等。
  • 在代码中添加注释,说明函数和变量的作用、输入和输出等信息,方便阅读和理解。
  • 在进行进制运算时,应该在每次运算前清空 number 数组,避免出现错误的计算结果。可以在每次运算前使用 memset 函数将 number 数组清空。
http://www.lryc.cn/news/339183.html

相关文章:

  • OceanBase—操作实践
  • 智慧用电安全管理系统
  • Rust语言入门第二篇-Cargo教程
  • 测试用例的编写方式
  • HarmonyOS实战开发-状态管理、通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。
  • 【Java开发指南 | 第二篇】标识符、Java关键字及注释
  • 3D可视化技术:研发基地的科技新篇章
  • 蓝旭前端05:JavaScript进阶
  • 【docker-compose】安装及配置
  • 【第十五届】蓝桥杯省赛C++b组
  • thinkphp6 Driver [Think] not supported.
  • 爱自然生命力专项基金:“爱·启航”残障家庭教育援助项目帮扶上万残障家庭
  • 【ubuntu】如何追加path
  • 用html写一个有趣的鬼魂动画
  • 【C++软件调试技术】C++软件开发维护过程中典型调试问题的解答与总结
  • Pygame经典游戏:贪吃蛇
  • 推荐一个免费使用Claude 3, GPT4和Gemini 1.5 Pro的网站
  • An Investigation of Geographic Mapping Techniques for Internet Hosts(2001年)第二部分
  • 解锁生成式 AI 的力量:a16z 提供的 16 个企业指南
  • Kylin使用心得
  • CentOS7使用Docker搭建Joplin Server并实现多端同步与公网使用本地笔记
  • C语言100道练习题打卡(1)
  • 5G-A有何能耐?5G-A三载波聚合技术介绍
  • 理解Go语言中上下文
  • [MySQL]数据库原理8——喵喵期末不挂科
  • 【算法基础】插入排序与二分查找、升级二分查找
  • 在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?
  • 基于51单片机的PM2.5监测系统设计—环境监测仪
  • 【C语言】指针篇-初识指针(1/5)
  • 【御控物联】物联网平台设备接入-JSON数据格式转化(场景案例四)