《北理C语言作业与解答2.pdf》由会员分享,可在线阅读,更多相关《北理C语言作业与解答2.pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、34 北理工的恶龙北理工的恶龙成绩:10/折扣:0.8背景:背景:最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟,于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数杀死恶龙,于是找到你寻求帮助。输入:输入:第一行 龙头数 n,勇士人数 m(1=n,m=100)接下来 n 行,每行包含一个整数,表示龙头的直径 接下来 m行,每行包含一个整数,
2、表示勇士的身高 l输出:输出:如果勇士们能完成任务,输出校长需要花的最小费用;否则输 出“bit is doomed!”时间限制时间限制1 秒64M内存限制内存限制0额外进程额外进程测试输入测试输入期待的输出期待的输出以文本方式显示1.2.3.4.5.6.2 354784以文本方式显示1.11测试用例测试用例1以文本方式显示1.2.3.4.2 15510以文本方式显示1.bit is doomed!1 秒64M0测试用例测试用例2#includevoid main()int s=0,t,i,j,m,n,a100,b100,c100;for(i=0;i=99;i+)ai=0,bi=0,ci=0;
3、scanf(%d%d,&m,&n);for(i=0;i=m-1;i+)1/29scanf(%d,&ai);for(i=0;in)printf(bit is doomed!n);elsefor(i=0;i=m-1;i+)for(j=i;jaj)t=ai,ai=aj,aj=t;for(i=0;i=n-1;i+)for(j=i;jbj)t=bi,bi=bj,bj=t;t=0;for(i=0;i=m-1;i+)for(j=0;j=n-1;j+)if(ai=bj)ct=bj;t+;bj=0;break;if(tm)printf(bit is doomed!n);elsefor(i=0;i=t;i+)s=
4、s+ci;printf(%dn,s);35 杀鸡用牛刀杀鸡用牛刀要用递归啊!要用递归啊!成绩:5/折扣:0.8背景:背景:哈哈!我们终于学了递归了,现在大家一定感到非常有意思吧,那个典型的“汉诺塔”问题,一个非常短的程序居然可以完成如此复杂的工作,真是神奇啊!来吧,让我们也动手编写一个递归程序,当然,我们要编写的不可能太复杂。2/29功能:功能:求整数 n 到 m区间的累加和,其中 n=m。输入:输入:区间的起始点 n 区间的终止点 m输出:输出:累加和要求:要求:使用递归算法完成。如此简单的题目当然要有隐含的测试用例啦,就3 个,看看谁能猜出来。时间限制时间限制 内存限制内存限制 额外进程额
5、外进程1 秒64M0测试输入测试输入期待的输出期待的输出以文本方式显示以文本方式显示测试用测试用例例 11.1 101.The sum from 1 to 10 is55.以文本方式显示1.The sum from 10 to 15 is75.1 秒64M0以文本方式显示测试用测试用例例 21.10 15#includeint sum(int m,int n)int i;if(n=m)i=n;elsei=n+sum(m,n-1);return(i);void main()int m,n;scanf(%d%d,&m,&n);printf(The sum from%d to%d is%d.n,m,
6、n,sum(m,n);3/29H13:安全的密码(选做):安全的密码(选做)成绩:5/折扣:0.8随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。任务任务林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现
7、在他向你求助,请你帮忙设计一个程序来解决这个问题。应当按照以下的规则来判断密码是否安全:1.2.3.4.如果密码长度小于 6 位,则不安全如果组成密码的字符只有一类,则不安全如果组成密码的字符有两类,则为中度安全如果组成密码的字符有三类或以上,则为安全通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。输入输入输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。输出输出针对每一个密码判断并输出它是否安全。对于不安全的密码输出 Not Safe,对于中度安全的密码输出 Medium Safe,对于安全的密码输出
8、Safe4/29输入样例输入样例41234abcdefABC1231#c3Gh输出样例输出样例Not SafeNot SafeMediumSafe Safe测试输入测试输入以文本方式显示1.102.abcDEF 3.ABC 4.qw 5.6.ABCDEFGHIJKLMNOPQRST7.123456789 8.1aB 9.1 B10.a X 11.qwe123%&ABC期待的输出期待的输出以文本方式显示1.Medium Safe2.Not Safe3.Not Safe4.Not Safe5.Not Safe6.Not Safe7.Safe8.Not Safe9.Safe10.Safe时间时间 内
9、存限内存限 额外额外限制限制进程进程制制1 秒 64M0测试测试用例用例1#include#includechar check(char s)int strlength;strlength=strlen(s);5/29int n4=0,0,0,0;int kind=0,i;if(strlength6)return n;/not safeelsefor(i=0;i=0&si=A&si=a&si=z)n2+;else n3+;for(i=0;i4;i+)if(ni!=0)kind+;if(kind=1)return n;/not safeif(kind=2)return m;/Medium Saf
10、ereturn s;/Safevoid main()int N,i;6/29char level;scanf(%dn,&N);char str50;for(i=0;iN;i+)gets(str);level=check(str);switch(level)case n:printf(Not Safen);break;case m:printf(Medium Safen);break;case s:printf(Safen);break;H14:身份证的奥秘(选做):身份证的奥秘(选做)成绩:5/折扣:0.8背景背景18 位身份证标准在国家质量技术监督局于1999 年 7 月 1 日实施的 GB
11、11643-1999 公民身份号码中做了明确的规定。GB11643-1999 公民身份号码为 GB11643-1989 社会保障号码的修订版,其中指出将原标准名称社会保障号码更名为公民身份号码,另外 GB11643-1999 公民身份号码从实施之日起代替GB11643-1989。GB11643-1999公民身份号码主要内容如下:7/29一、范围一、范围该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。二、编码对象二、编码对象公民身份号码的编码对象是具有中华人民共和国国籍的公民。三、号码的结构和表示形式三、号码的结构和表示形式1、号码的结构、
12、号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。2、地址码、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T2260 的规定执行。3、出生日期码、出生日期码表示编码对象出生的年、月、日,按GB/T7408 的规定执行,年、月、日代码之间不用分隔符。4、顺序码、顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。5、校验码、校验码(1)十七位数字本体码加权求和公式S=Sum(Ai*Wi)
13、,i=0,.,16,先对前 17 位数字的权求和Ai:表示第 i位置上的身份证号码数字值Wi:表示第 i位置上的加权因子Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模8/29Y=mod(S,11)(3)通过模得到对应的校验码Y:0 1 2 3 4 5 6 7 8 9 10校验码:1 0 X 9 8 7 6 5 4 3 2四、举例如下:四、举例如下:北京市朝阳区:111002X广东省汕头市:440524415 位的身份证号升级办法:15 位的身份证号:dddddd yymmdd xx p18 位的身份证号:dddddd yyyymmdd xx p y其中
14、 dddddd 为地址码(省地县三级)yyyymmdd yymmdd为出生年月日xx 顺号类编码p 性别15 位的 yy 年升为 18 位后,变成 19yy 年,但对于百岁以上老人,则为 18yy 年,此时,他们的最后三位顺序码为996,997,998或 999 来标记。输入输入输入 n 组身份证号码,第一行为个数,以后每行为身份证号码。输出输出如果输入的身份证号码为15 位,则将其升级为 18 位后显示输出;否则判断其是否为合法身份证号,并逐行输出。时间限制时间限制1 秒64M内存限制内存限制0额外进程额外进程测试输入测试输入以文本方式显示期待的输出期待的输出以文本方式显示测试用例测试用例1
15、1.2.3.4.43530331 111002X 11021.Invalid 2.Valid 3.111002X 9/295.11964.1119965#include#includevoid shengji(char str)int n=strlen(str);/n=15char newstr19;int i;for(i=0;i6;i+)newstri=stri;/前六位地址码(省地县三级)for(i=8;i17;i+)/newstr中的到第位newstri=stri-2;newstr6=1;char temp4;temp0=str12;temp1=str13;temp2=str14;10/
16、29temp3=0;if(strcmp(temp,996)=0|strcmp(temp,997)=0|strcmp(temp,998)=0|strcmp(temp,999)=0)newstr7=8;else newstr7=9;/下面是校检码,0 的 ascii 码值是int Wi17=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;/权重int S=0;for(i=0;i17;i+)S=S+Wii*(int)(newstri)-48);int y;y=S%11;switch(y)case 0:newstr17=1;break;case 1:newstr17=0;bre
17、ak;case 2:newstr17=X;break;case 3:newstr17=9;break;case 10:newstr17=2;break;11/29default:newstr17=(char)(12-y+48);break;newstr18=0;strcpy(str,newstr);int IscheckedValid(char str)int n=strlen(str);/n=18int num17;/保存前位int i;for(i=0;i17;i+)/保存前位numi=(int)stri-48;/下面是校检码,0 的 ascii 码值是int Wi17=7,9,10,5,8
18、,4,2,1,6,3,7,9,10,5,8,4,2;/权重int S=0;for(i=0;i17;i+)S=S+Wii*numi;int y;12/29y=S%11;char lastnum;switch(y)case 0:lastnum=1;break;case 1:lastnum=0;break;case 2:lastnum=X;break;case 3:lastnum=9;break;case 10:lastnum=2;break;default:lastnum=(char)(12-y+48);break;if(lastnum=str17)return 1;elsereturn 0;/0
19、 表示不合法void run(char str)int n=strlen(str);/2913if(n=15)shengji(str);printf(%sn,str);else if(n=18)if(!IscheckedValid(str)printf(Invalidn);else printf(Validn);else printf(Invalidn);void main()int n;scanf(%dn,&n);char str25;for(int i=0;in;i+)gets(str);/2914run(str);36 科学记数法科学记数法成绩:10/折扣:0.8对于非常大或者非常小的数
20、据,我们通常用科学记数法来表示。例如在科技文献和电脑中经常遇到的 2.3 106(计算机中的科学记数法表示为:2.3E6),或者 9.18 10-5(科学记树法表示:9.18E-5)这种类型的数据。输入:输入:用科学记数法表示的数据。即为符合C 语言表示的科学记数法表示。输出:输出:该数据的双精度表示说明:说明:输入数据的精度不高于小数点后50 位。输入数据时,在实数实数和幂幂之间有空格空格进行分隔,空格个数不定。结果保留到小数点后 8 位,如不足 8 位用 0 补足,超过 8 位则截断,不进行四舍五入的处理。时时额额内内间间外外存存限限进进限限制制程程制制测测试试以文本方式显示用用1.1.2
21、345 E 3例例1测测以文本方式显示试试用用1.1.2345 e-3 例例以文本方式显示1.1234.50000000 测试输入测试输入期待的输出期待的输出1 64 0秒M以文本方式显示1.0.00123450 1 64 0秒M15/292测测1 64 0以文本方式显示以文本方式显示试试秒M用用1.2.23456789123456789123451.223456789123456789123.4567例例6789 e 208900 3测测试试以文本方式显示用用1.1 E 0例例4测测试试以文本方式显示用用1.2.23456789 E 1例例6以文本方式显示1.1.00000000 1 64
22、0秒M以文本方式显示1.22.34567890 1 64 0秒M#include stdio.hint main()int p=-1,n,i=0,j,sign=0,flag=0;char c,s100;while(scanf(%c,&c)&c!=e&c!=E)if(c=.)p=i-1;else if(c=0)si=c,i+;else if(c=-)sign=1;else if(p0)p=i-1;for(j=i;j=60;j+)sj=0;scanf(%d,&n);p+=n;if(sign)printf(-);if(p0)p=-p-1;printf(0.);for(i=1;i=p&i=8;i+)p
23、rintf(0);for(i=1;i=8-p;i+)printf(%c,si-1);else16/29i=0;while(i=p)if(si=0&!flag&ip)i+;elseflag=1;printf(%c,si+);printf(.);for(j=1;j=8;j+)printf(%c,si+);printf(n);return 0;37 大数分解大数分解成绩:5/折扣:0.82007 级在“计算机科学导论”的期末考试中有一道试题。下面请你看看那题目应该如何编写。从键盘输入的一个大于 1 的整数,通过算法将该整数分解为若干因子的乘积。输入:输入:一个正整数。输出:输出:分解后的各个因子。测
24、试输入测试输入期待的输出期待的输出时间限制时间限制内存限制内存限制64M额外进程额外进程0以文本方式显示1 秒以文本方式显示测试用例测试用例 11.241.2.3.4.2223以文本方式显示以文本方式显示1 秒测试用例测试用例 21.171.1764M0测试用例测试用例 3以文本方式显示以文本方式显示1 秒17/2964M01.151.32.564M0以文本方式显示以文本方式显示1 秒测试用例测试用例 41.31.3#include void main()int n,i;scanf(%d,&n);for(i=2;n1;)if(n%i=0)printf(%dn,i);n/=i;else i+;3
25、8 回文字符串回文字符串递归递归成绩:5/折扣:0.8有一种特殊形式的字符串,其正反序相同,被称为“回文字符串”。例如LeveL 就是一个回文字符串。输入:输入:字符串输出:输出:Yes 或者 No说明:说明:如输出 Yes,说明输入的字符串是一个回文字符串输出 No,说明输入的字符串不是一个回文字符串请使用递归算法实现。测试输入测试输入期待的输出期待的输出时间限制时间限制内存限制内存限制64M额外进程额外进程0以文本方式显示测试用例测试用例 11.LeveL 以文本方式显示 1 秒1.Yes 18/29#include#includeint fun(char str,int a,int b)
26、if(stra!=strb)return 0;elseif(a=b|a+1=b&stra+1=strb)return 1;elseif(stra=strb)return 1&fun(str,a+1,b-1);void main()char str100;scanf(%s,str);int n;n=strlen(str);switch(fun(str,0,n-1)case 1:printf(Yesn);break;case 0:printf(Non);break;39 求最大公约数求最大公约数递归递归成绩:5/折扣:0.8请使用递归算法计算正整数n 和 m 的最大公约数 GCD(n,m)。=m
27、当 m=n且 n mod m=0GCD(N,M)=GCD(m,n)当 nm 时=GCD(m,n mod m)其他输入:输入:n 和 m输出:输出:n 和 m 的最大公约数测试输入测试输入期待的输出期待的输出时间限制时间限制内存限制内存限制64M额外进程额外进程0测试用例测试用例 1以文本方式显示以文本方式显示1 秒19/291.24 481.2464M0以文本方式显示以文本方式显示1 秒测试用例测试用例 21.13 151.1#include int gcd(int n,int m)if(m=n&n%m=0)return m;elseif(nm)return gcd(m,n);elseretu
28、rn gcd(m,n%m);void main()int n,m;scanf(%d%d,&n,&m);printf(%dn,gcd(n,m);40 求序列之和求序列之和递归递归成绩:5/折扣:0.8请使用递归算法求下列序列的前n 项之和。1+1/2-1/3+1/4-1/5.输入:输入:n输出:输出:序列的前 n 项和(精确到小数点之后第6 位)测试输入测试输入期待的输出期待的输出时间限制时间限制1 秒内存限制内存限制64M额外进程额外进程0以文本方式显示以文本方式显示测试用例测试用例 11.11.120/29以文本方式显示以文本方式显示测试用例测试用例 21.21.1.5000001 秒64M
29、0以文本方式显示以文本方式显示测试用例测试用例 31.31.1.1666671 秒64M0#include double fun(int n)if(n=1)return 1;if(n%2=0)return fun(n-1)+1.0/n;if(n%2=1)return fun(n-1)-1.0/n;void main()int n,m;scanf(%d,&n);if(n=1)printf(1n);elseprintf(%0.6lfn,fun(n);42 子串反向子串反向递归递归成绩:10/折扣:0.8请编写一个递归函数 reverse(char str,int start,int end),该函
30、数的功能是将串 str中下标从 start开始到 end 结束的字符颠倒顺序。假设 start和 end 都在合理的取值范围。例如:执行前:str=0123456;start=1;end=4执行后:strr=0432156要求在该函数中不使用新的数组,没有循环。注意:只需要编写递归函数注意:只需要编写递归函数 reverse,系统中已经设置好了,系统中已经设置好了 main 函数。函数。21/29预设代码预设代码前置代码前置代码view plaincopy to clipboardprint?1./*PRESET CODE BEGIN-NEVER TOUCH CODE BELOW*/2.3.#
31、include 4.intint main()5.charchar str100;6.intint start,end;7.gets(str);8.scanf(%d%d,&start,&end);9.reverse(str,start,end);10.printf(%sn,str);11.returnreturn 0;12.13.14./*PRESET CODE END-NEVER TOUCH CODE ABOVE*/*PRESET CODE BEGIN-NEVER TOUCH CODE BELOW*/#include int main()char str100;int start,end;g
32、ets(str);scanf(%d%d,&start,&end);reverse(str,start,end);printf(%sn,str);return 0;/*PRESET CODE END-NEVER TOUCH CODE ABOVE*/测试输入测试输入期待的输出期待的输出时间限制时间限制内存限制内存限制64M额外进程额外进程0以文本方式显示测试用例测试用例 11.2.1 41 秒以文本方式显示1.测试用例测试用例 6以文本方式显示 以文本方式显示1 秒64M022/291.2.6 10以文本方式显示测试用例 71.2.0 101.1 秒以文本方式显示1.64M0/*PRESET CO
33、DE BEGIN-NEVER TOUCH CODE BELOW*/#include int main()char str100;int start,end;gets(str);scanf(%d%d,&start,&end);reverse(str,start,end);printf(%sn,str);return 0;/*PRESET CODE END-NEVER TOUCH CODE ABOVE*/void reverse(char str,int start,int end)int i=start,j=end,p=0;char temporary;while(strp!=0)p+;if(s
34、tartp&endp)for(;i=j;i+,j-)temporary=stri;stri=strj;strj=temporary;else if(start=p)j=p-1;for(;i=j;i+,j-)temporary=stri;stri=strj;23/29strj=temporary;H17:高精度加减法(选作):高精度加减法(选作)成绩:10/折扣:0.8背景:背景:计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。你现在接受了一个任务,要编写一个高精度计算器的核心部分
35、。所谓高精度计算器,就是可以计算很大很大的数据的计算器。输入:输入:输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。输出:输出:对应着输入的每一行数据,输出计算的结果,每个结果占一行。时时额额内内间间外外存存限限进进限限制制程程制制测测以文本方式显示试试用用1.2例例2.213914+234661233.32863 1测测以文本方式显示试试以文本方式显示1.2.测试输入测试输入期待的输出期待的输出1 640秒 M以文本方式显示1 640秒 M24/29用用例例21.2.3.4.
36、3483291674192731231+12365123123129678463287567264871236999999999+1 1.17194789110054663542.1231691142 3.1000000000 以文本方式显示1.112.56789+56789 3.45555+44445 4.1+12345 5.12345+1 6.98765-98760 7.12345-9876 8.12345-12345 9.12345-12346 10.1-5432111.0-012.0+0以文本方式显示1.113578 2.90000 3.12346 4.12346 5.56.2469
37、7.08.-19.-5432010.011.01 640秒 M测测试试用用例例3#include#include#include#include stdlib.hvoid main()int n=0,i=0,j=0,k=0,b=0;char a3500=0;int n1=0,n2=0;char s500=0;int n3=0;int c=0,c1=0;int temp=0;char op;char str1001=0;char*result;scanf(%d,&n);result=(char*)malloc(501*n);/根据输入的 n 申请内存空间*result=0;25/29/*每次循环
38、都要初始化*/for(;in;i+)/gets(str);for(j=0;jn2?n1:n2;/*计算加法*/if(op=+)for(;n1=0&n2=0;n1-,n2-,n3-)temp=a0n1+a1n2-96;temp+=c;if(temp=10)sn3=temp%10+48;c=1;26/29elsesn3=temp+48;c=0;/forwhile(n1=0)temp=a0n1-48;temp+=c;if(temp=10)sn3=48;c=1;elsesn3=temp+48;c=0;n1-;n3-;/while n1while(n2=0)temp=a1n2-48;temp+=c;if
39、(temp=10)sn3=48;c=1;elsesn3=temp+48;c=0;n2-;n3-;/while n2if(c)strcat(result,1);strcat(result,s);strcat(result,n);27/29/if op/*计算减法*/else/*保证减数大于被减数*如果被减数大于减数,则交换2 数,并设置变量*/if(strcmp(a0,a1)0)/a2=a0;a0=a1;a1=a2;for(b=0;b3;b+)j=(b+2)%3;for(k=0;k=0;n1-,n2-,n3-)temp=a0n1-a1n2;temp-=c;if(temp=0)sn3=temp+48;c=0;elsesn3=temp+58;c=1;/forwhile(n1=0)temp=a0n1-48;temp-=c;if(temp=0)sn3=temp+48;c=0;28/29elsesn3=temp+58;c=1;n1-;n3-;if(c1)strcat(result,-);/*消除减法结果高位的 0*/j=0;while(sj=48)j+;strcat(result,s+j);strcat(result,n);/else op/for iprintf(%s,result);getch();29/29
限制150内