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

sse哈工大C语言编程练习45

2026 年 3 月 17 日

收获:

  1. 判断直角三角形时,两边的平方和减第三边的平方和小于 0.1 即可认为是直角三角形,主要看题目给的测试用例,确定精度。
  2. 取余和除法第二个数都不能为 0,若遇到则输出错误提示信息,直接返回。
  3. 动态规划先初始化边界条件,再根据每一步的操作选取最优的一种方式,依次更新状态。

1. 三角形判断(Q484)

题目描述:
输入三角形的三条边 a,b,c,判断它们能否构成三角形。若能构成三角形,指出是何种三角形(等腰三角形、直角三角形、一般三角形)。

输入格式要求:"%f,%f,%f"提示信息:"Input the three edge length: "
输出格式要求:"等腰三角形""直角三角形""一般三角形""不是三角形"

程序运行示例:

① Input the three edge:3,4,5↙ 直角三角形 ② Input the three edge:4,4,5↙ 等腰三角形 ③ Input the three edge:10,10,14.14↙ 等腰直角三角形 ④ Input the three edge:3,4,9↙ 不是三角形
#include<stdio.h>#include<math.h>intmain(){floata,b,c;printf("Input the three edge length: ");scanf("%f,%f,%f",&a,&b,&c);// 首先判断是否能构成三角形:任意两边之和大于第三边if(a+b>c&&a+c>b&&b+c>a&&a>0&&b>0&&c>0){// 判断是否为直角三角形(勾股定理,允许 0.1 的误差)if(fabs(a*a+b*b-c*c)<0.1||fabs(a*a+c*c-b*b)<0.1||fabs(b*b+c*c-a*a)<0.1){// 既是直角又是等腰if(a==b||b==c||a==c){printf("等腰直角三角形");}else{printf("直角三角形");}}elseif(a==b||b==c||a==c){// 等腰三角形printf("等腰三角形");}else{// 一般三角形printf("一般三角形");}}else{printf("不是三角形");}return0;}

2. 数组相邻元素乘积(Q2136)

题目描述:
任意从键盘输入 10 个整数存入数组 a 中,从数组 a 的第二个元素起,分别将后项乘以前项之积存入数组 b 中,并输出数组 b 的内容。

要求输入提示信息为:无输入提示信息
要求输入格式要求为:"%d"
要求输出格式要求为:"%3d"

#include<stdio.h>intmain(){inta[10],b[10];// 输入 10 个整数for(inti=0;i<10;i++){scanf("%d",&a[i]);}// 计算相邻元素的乘积并输出for(inti=1;i<10;i++){b[i-1]=a[i]*a[i-1];printf("%3d",b[i-1]);}return0;}

说明:

  • b[0] = a[1] × a[0]
  • b[1] = a[2] × a[1]
  • b[9] = a[9] × a[8]

3. 简单计算器(字符串解析)(Q3810)

题目描述:
从键盘输入任意一个整数算术表达式如:10+20,请给出其运算结果,如果不能计算则显示"Error"。提示键盘输出 +、-、*、/、%中的运算符为 ASCII 字符,不能直接运算。

输入格式:10+29
输出格式:10+29=39(或者 Error)
(要求 switch 语句实现,可以添加 if 判断)

#include<stdio.h>#include<string.h>intmain(){charstr[80];fgets(str,80,stdin);// 读取表达式字符串for(inti=0;i<strlen(str)-1;i++){inta=0,b=0,result;charc;// 解析第一个数字while(str[i]>='0'&&str[i]<='9'){a=a*10+str[i]-'0';i++;}// 获取运算符c=str[i++];// 解析第二个数字while(str[i]>='0'&&str[i]<='9'){b=b*10+str[i]-'0';i++;}// 检查除数和取余的合法性if((c=='/'||c=='%')&&b==0){printf("Error");return0;}// 根据运算符进行计算switch(c){case'+':result=a+b;break;case'-':result=a-b;break;case'*':result=a*b;break;case'/':result=a/b;break;case'%':result=a%b;break;default:printf("Error");return0;}printf("%d%c%d=%d",a,c,b,result);}return0;}

4. 求商(改错)(Q1124)

题目描述:
求用户输入的两个数的商,程序运行时,以如下格式输入数据:

Input two integers:4 2↙

请改正程序中的错误,使它能得出正确的结果。

原代码(有错误):

#include<stdio.h>main(){inta,b,c;printf("Input two integers:");scanf("%d %d",&a,&b);c=a\b;// 错误:反斜杠\应该是正斜杠/printf("The quotient of a and b is :%d",c);}

改正后的代码:

#include<stdio.h>intmain(){inta,b,c;printf("Input two integers:");scanf("%d %d",&a,&b);c=a/b;// 修正:使用正斜杠/表示除法printf("The quotient of a and b is :%d",c);return0;}

主要错误:

  • c = a\b;c = a/b;(C 语言中除法运算符是/而不是\

5. 编辑距离(动态规划)(Q6590)

题目描述:
编辑距离(Edit Distance):定义从字符串 a 变到字符串 b,所需要的最少的操作步骤(插入,删除,更改)为两个字符串之间的编辑距离。

例如:eeba 和 abca 的编辑距离为 3:

  1. 将 e 变为 a
  2. 删除 e
  3. 添加 c
    共 3 个步骤。

请编程实现 edit distance。

输入输出格式:

printf("Please input the first string\n"); gets(); printf("Please input the second string\n"); gets(); printf("The distance is %d\n",);

用到的函数有:

intmin(inta,intb,intc)intminDistance(char*s1,char*s2)

程序示例:

Please input the first string eeba Please input the second string abca The distance is 3
#include<stdio.h>#include<string.h>#include<stdlib.h>// 函数声明intmin(inta,intb,intc);intminDistance(char*s1,char*s2);intmain(){chars1[1000],s2[1000];printf("Please input the first string\n");scanf("%s",s1);printf("Please input the second string\n");scanf("%s",s2);intmindis=minDistance(s1,s2);printf("The distance is %d",mindis);return0;}// 求三个数的最小值intmin(inta,intb,intc){intmin=a;if(b<min)min=b;if(c<min)min=c;returnmin;}// 计算编辑距离(动态规划)intminDistance(char*s1,char*s2){intlen1=strlen(s1),len2=strlen(s2);// 创建二维数组 dp[i][j]表示 s1 前 i 个字符和 s2 前 j 个字符的编辑距离int**dp=(int**)malloc((len1+1)*sizeof(int*));for(inti=0;i<=len1;i++){dp[i]=(int*)malloc((len2+1)*sizeof(int));}// 初始化边界条件// s1 为空时需要插入 len2 个字符for(intj=0;j<=len2;j++){dp[0][j]=j;}// s2 为空时需要删除 len1 个字符for(inti=0;i<=len1;i++){dp[i][0]=i;}// 动态规划填表for(inti=1;i<=len1;i++){for(intj=1;j<=len2;j++){if(s1[i-1]==s2[j-1]){// 字符相同,不需要操作dp[i][j]=dp[i-1][j-1];}else{// 取三种操作的最小值dp[i][j]=min(dp[i-1][j]+1,// 删除dp[i][j-1]+1,// 插入dp[i-1][j-1]+1// 替换);}}}intresult=dp[len1][len2];// 释放内存for(inti=0;i<=len1;i++){free(dp[i]);}free(dp);returnresult;}

动态规划思路说明:

  1. 状态定义dp[i][j]表示 s1 的前 i 个字符和 s2 的前 j 个字符的编辑距离

  2. 边界条件

    • dp[0][j] = j:空串变成 s2 的前 j 个字符需要 j 次插入
    • dp[i][0] = i:s1 的前 i 个字符变成空串需要 i 次删除
  3. 状态转移方程

    • 如果s1[i-1] == s2[j-1]dp[i][j] = dp[i-1][j-1](无需操作)
    • 否则:dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
      • 删除:dp[i-1][j] + 1
      • 插入:dp[i][j-1] + 1
      • 替换:dp[i-1][j-1] + 1
  4. 时间复杂度:O(m×n),m 和 n 分别为两个字符串的长度

http://www.jsqmd.com/news/495451/

相关文章:

  • Keil MDK-ARM避坑指南:STM32开发环境搭建中的5个常见错误及解决方法
  • DeepSeek + Kimi 一键安装 AI 编程助手教程(零基础 5 分钟)
  • tao-8k从零到一:跟着教程,10分钟搭建你的文本嵌入服务
  • 基于STM32的跑步姿态检测与优化系统(论文+源码)
  • 5个标签以上怎么放?图标用线性还是面性?兰亭妙微一次讲透底部Tab栏设计 - ui设计公司兰亭妙微
  • 主流框架Detectron3介绍
  • python+Ai技术框架的爬虫基于 的会议室预订系统设计与实现django flask
  • Python与CatBoost的顾客婚姻状态预测填补及特征类型策略分析 | 附代码数据
  • 2026年口碑好的园林水景品牌厂家大盘点,看看哪家更靠谱 - 工业品网
  • NILMTK环境搭建实战:从Anaconda到Pycharm的避坑指南
  • 【iOS】Fastlane自动化打包与分发:从TestFlight到蒲公英的完整实践
  • 2026年泉州园林水景施工企业年度排名,揭秘哪家口碑更好 - 工业推荐榜
  • C#联合Halcon运动控制与视觉框架源码:连线式程序,开源可二次开发
  • 中山大学团队联合中科院深研院推出EviAgent模型,既能自动生成高质量的放射科报告,又能满足全程可追溯、可解释的条件
  • 2026年内蒙古学美容美发哪家好?呼和浩特市丽妍职业培训学校分析! - 深度智识库
  • 2026-双足行走机器人行业发展综述
  • 最新数据公布!2026年这些岗位月薪六位数,普通人还能上车吗?
  • STC8H高级PWM功能详解:互补输出与死区时间配置指南
  • 医疗系统如何通过百度WebUploader组件优化病历PDF文件的浏览器端分片断点恢复?
  • 中2条以上,说明领导已经把你归为核心圈
  • 基于Python常见地球科学数据(ERA5、雪深、积雪覆盖、海温、植被指数、土地利用)处理实践技术应用
  • 智能合约 -透明可升级合约[ hardhat、openzeppelin 、ethers ]的演示 demo
  • useMemo vs useCallback:核心区别与使用场景
  • ACDC变换器:单相PFC_Boost+后级半桥LLC,功率因素矫正及软开关技术实现(300W...
  • 2026年AI搜索优化公司深度测评:从技术到效果的客观分析与选型指南 - 小白条111
  • 麟智产业通,为您的企业数字化需求保驾护航
  • HCIP 路由控制 实验一
  • 2026年全国园林景观工程公司Top10,源石石业产品种类丰富吗 - myqiye
  • 2026年ASOC SCI2区TOP,基于人工蜂群算法和自适应大邻域搜索的星环网络设计问题求解方法,深度解析+性能实测
  • 论文排版之参考文献