news 2026/8/7 5:50:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 分别为两个字符串的长度

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:19:18

ETest5 AI 测试|让每个系统工程师都拥有超级助手

在仿真测试和工程开发领域&#xff0c;效率提升与智能化升级始终是行业追求的核心目标。ETest5 在原有强大仿真测试能力的基础上&#xff0c;重磅引入AI 功能能力中心&#xff0c;打造全流程智能化辅助体系&#xff0c;通过九大核心 AI 功能&#xff0c;为嵌入式软件开发、通信…

作者头像 李华
网站建设 2026/7/14 15:19:03

2026年AI资讯网站评估:5大平台深度剖析与实战指南(含多维度评分与案例详解)

一、宏观趋势与核心命题 在数字化转型与人工智能深度融合的背景下&#xff0c;资讯平台正由信息聚合向认知协作演进。行业观察表明&#xff0c;AI在资讯分发中的作用已从辅助筛选演进为直接参与语义理解、个性化匹配与可解释推荐的核心环节。驱动因素包括&#xff1a;信息总量激…

作者头像 李华
网站建设 2026/7/14 15:19:02

HIMA F3113A输出放大器模块

HIMA F3113A 输出放大器模块是HIMA安全控制系统中的一种信号输出接口模块&#xff0c;主要用于将控制系统产生的信号进行功率放大&#xff0c;并输出到现场执行设备。该模块具有稳定可靠的输出能力&#xff0c;可确保安全系统在工业环境中的高可靠运行&#xff0c;常用于各类安…

作者头像 李华
网站建设 2026/7/14 15:19:16

小白程序员必看:收藏这份Skill进化秘籍,轻松玩转2026大模型Agent!

本文介绍了AutoSkill和XSKILL两篇顶流机构论文的核心观点&#xff0c;指出静态Skill只是高级Prompt&#xff0c;能自我进化的Skill才是真正的数字资产。文章详细解析了AutoSkill的双循环架构和Skill Management决策&#xff0c;以及XSKILL的双流知识架构和协同进化机制。通过真…

作者头像 李华