北理C语言作业及答案Word版

上传人:仙*** 文档编号:36143862 上传时间:2021-10-29 格式:DOC 页数:32 大小:305KB
收藏 版权申诉 举报 下载
北理C语言作业及答案Word版_第1页
第1页 / 共32页
北理C语言作业及答案Word版_第2页
第2页 / 共32页
北理C语言作业及答案Word版_第3页
第3页 / 共32页
资源描述:

《北理C语言作业及答案Word版》由会员分享,可在线阅读,更多相关《北理C语言作业及答案Word版(32页珍藏版)》请在装配图网上搜索。

1、传播优秀Word版文档 ,希望对您有帮助,可双击去除!34 北理工的恶龙成绩: 10 / 折扣: 0.8背景:最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数杀死恶龙,于是找到你寻求帮助。输入:第一行 龙头数 n , 勇士人数 m ( 1=n, m=100 ) 接下来 n 行,每行包含一个整数,

2、表示龙头的直径 接下来 m 行,每行包含一个整数,表示勇士的身高 l输出:如果勇士们能完成任务,输出校长需要花的最小费用;否则输 出 “ bit is doomed! ” 测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 2 32. 53. 44. 75. 86. 4以文本方式显示1. 111秒 64M 0 测试用例 2以文本方式显示1. 2 12. 53. 54. 10以文本方式显示1. bit is doomed!1秒 64M 0#includevoid main() int s=0,t,i,j,m,n,a100,b100,c100; for(i=0;i=99;i+

3、) ai=0,bi=0,ci=0; scanf(%d%d,&m,&n); for(i=0;i=m-1;i+) scanf(%d,&ai); for(i=0;in)printf(bit is doomed!n);else for(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 i

4、s doomed!n); else for(i=0;i=t;i+) s=s+ci; printf(%dn,s);35 杀鸡用牛刀要用递归啊!成绩: 5 / 折扣: 0.8背景:哈哈!我们终于学了递归了,现在大家一定感到非常有意思吧,那个典型的“汉诺塔”问题,一个非常短的程序居然可以完成如此复杂的工作,真是神奇啊!来吧,让我们也动手编写一个递归程序,当然,我们要编写的不可能太复杂。功能:求整数 n 到 m 区间的累加和,其中n=m。输入:区间的起始点n 区间的终止点m输出:累加和要求:使用递归算法完成。如此简单的题目当然要有隐含的测试用例啦,就3个,看看谁能猜出来。测试输入期待的输出时间限制内存

5、限制额外进程测试用例 1以文本方式显示1. 1 10以文本方式显示1. The sum from 1 to 10 is 55.1秒 64M 0 测试用例 2以文本方式显示1. 10 15以文本方式显示1. The sum from 10 to 15 is 75.1秒 64M 0 #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,n,sum(m,n)

6、;H13:安全的密码(选做)成绩: 5 / 折扣: 0.8随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。任务林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个

7、问题。应当按照以下的规则来判断密码是否安全:1. 如果密码长度小于 6 位,则不安全 2. 如果组成密码的字符只有一类,则不安全 3. 如果组成密码的字符有两类,则为中度安全 4. 如果组成密码的字符有三类或以上,则为安全 通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。输入输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。输出针对每一个密码判断并输出它是否安全。对于不安全的密码输出 Not Safe,对于中度安全的密码输出 Medium Safe,对于安全的密码输出 Safe输入样例41234abcde

8、fABC1231#c3Gh输出样例Not SafeNot SafeMediumSafe Safe测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 102. abcDEF3. ABC4. qw5. 6. ABCDEFGHIJKLMNOPQRST7. 123456789012345678908. 1aB9. 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秒 64M 0 #include #include char check(char s) int strlength; strlength=strlen(s); int n4=0,0,0,0; int kind=0,i; if(strlength6) return n;/not safe else for(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 safe if(kind=2) return m;/Medium Safe return s;/Saf

10、e void main() int N,i; char 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日实施的GB11643-1999公民身份号码中做

11、了明确的规定。 GB11643-1999公民身份号码为GB11643-1989社会保障号码的修订版,其中指出将原标准名称社会保障号码更名为公民身份号码,另外GB11643-1999公民身份号码从实施之日起代替GB11643-1989。GB11643-1999公民身份号码主要内容如下: 一、范围 该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。 二、编码对象 公民身份号码的编码对象是具有中华人民共和国国籍的公民。 三、号码的结构和表示形式 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:

12、六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 5、校验码 (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, . , 16 ,先对前17位数字的权求和 Ai: 表示第i位置上的身份证号码数字值 Wi: 表

13、示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模 Y = 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 四、举例如下: 北京市朝阳区: 11010519491231002X 广东省汕头市: 440524188001010014 15位的身份证号升级办法: 15位的身份证号:dddddd yymmdd xx p 18位的身份证号:dddddd yyyymmdd xx p y 其中dddddd为地址码(省地县三级) yy

14、yymmdd yymmdd 为出生年月日 xx顺号类编码 p性别 15 位的 yy 年升为 18 位后,变成 19yy年,但对于百岁以上老人, 则为 18yy 年,此时,他们的最后三位顺序码为996, 997, 998 或 999 来标记。 输入 输入n组身份证号码,第一行为个数,以后每行为身份证号码。 输出 如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。 测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 42. 350622197904130331以文本方式显示1. Invalid2. Valid3.1秒 64M

15、 0 3. 11010519491231002X4. 1101054912310025. 11010549123199611010519491231002X4. 110105184912319965#include #include void shengji(char str) int n=strlen(str);/n=15 char newstr19; int i; for(i=0;i6;i+) newstri=stri;/前六位地址码(省地县三级) for(i=8;i17;i+)/newstr中的到第位 newstri=stri-2; newstr6=1; char temp4; temp

16、0=str12; temp1=str13; temp2=str14; temp3=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) cas

17、e 0:newstr17=1;break; case 1:newstr17=0;break; case 2:newstr17=X;break; case 3:newstr17=9;break; case 10:newstr17=2;break; default: newstr17=(char)(12-y+48);break; newstr18=0; strcpy(str,newstr); int IscheckedValid(char str) int n=strlen(str);/n=18 int num17;/保存前位 int i; for(i=0;i17;i+)/保存前位 numi=(i

18、nt)stri-48; /下面是校检码,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*numi; int y; y=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=(cha

19、r)(12-y+48);break; if(lastnum=str17) return 1; else return 0;/0表示不合法 void run(char str) int n=strlen(str); if(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

20、 i=0;in;i+) gets(str); run(str); 36 科学记数法成绩: 10 / 折扣: 0.8对于非常大或者非常小的数据,我们通常用科学记数法来表示。例如在科技文献和电脑中经常遇到的 2.3106 (计算机中的科学记数法表示为:2.3E6),或者 9.1810-5 (科学记树法表示:9.18E-5)这种类型的数据。 输入:用科学记数法表示的数据。即为符合C语言表示的科学记数法表示。输出:该数据的双精度表示说明:输入数据的精度不高于小数点后50位。输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入

21、的处理。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 1.2345 E 3以文本方式显示1. 1234.500000001秒 64M 0 测试用例 2以文本方式显示1. 1.2345 e-3以文本方式显示1. 0.001234501秒 64M 0 测试用例 3以文本方式显示1. 2.23456789123456789123456789 e 20以文本方式显示1. 223456789123456789123.456789001秒 64M 0 测试用例 4以文本方式显示1. 1 E 0以文本方式显示1. 1.000000001秒 64M 0 测试用例 6以文本方式显示1

22、. 2.2345678901234567890 E 1以文本方式显示1. 22.345678901秒 64M 0 #include stdio.h int 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)

23、 p=-p-1; printf(0.); for(i=1;i=p&i=8;i+) printf(0); for(i=1;i=8-p;i+) printf(%c,si-1); else i=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、数,通过算法将该整数分解为若干因子的乘积。输入:一个正整数。输出:分解后的各个因子。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 24以文本方式显示1. 22. 23. 24. 31秒 64M 0 测试用例 2以文本方式显示以文本方式显示1秒 64M 0 1. 171. 17测试用例 3以文本方式显示1. 15以文本方式显示1. 32. 51秒 64M 0 测试用例 4以文本方式显示1. 3以文本方式显示1. 31秒 64M 0 #include void main() int n,i; scanf(%d,&n); for(i=2;n1;) if(n%i=0) pr

25、intf(%dn,i);n/=i; else i+; 38 回文字符串递归成绩: 5 / 折扣: 0.8有一种特殊形式的字符串,其正反序相同,被称为“回文字符串”。例如LeveL就是一个回文字符串。输入:字符串输出:Yes或者No说明:如输出Yes,说明输入的字符串是一个回文字符串输出No,说明输入的字符串不是一个回文字符串请使用递归算法实现。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示以文本方式显示1秒 64M 0 1. LeveL1. Yes#include #include int fun(char str,int a,int b) if(stra!=strb)

26、return 0 ; else if(a=b|a+1=b&stra+1=strb) return 1; else if(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 当 m=n

27、 且 n mod m =0GCD(N,M) = GCD(m,n) 当nm时= GCD(m, n mod m) 其他输入:n和m输出:n和m的最大公约数测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示以文本方式显示1秒 64M 0 1. 24 481. 24测试用例 2以文本方式显示1. 13 15以文本方式显示1. 11秒 64M 0 #include int gcd(int n,int m) if(m=n&n%m=0) return m; else if(nm) return gcd(m,n); else return gcd(m,n%m); void main() in

28、t 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以文本方式显示1. 1以文本方式显示1. 11秒 64M 0 测试用例 2以文本方式显示以文本方式显示1秒 64M 0 1. 21. 1.500000测试用例 3以文本方式显示1. 3以文本方式显示1. 1.1666671秒 64M 0 #include d

29、ouble 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); else printf(%0.6lfn,fun(n); 42 子串反向递归成绩: 10 / 折扣: 0.8请编写一个递归函数 reverse(char str, int start, int end ) ,该函数的功能是将串 str 中下标从 start 开始到 end 结束的字符颠倒顺

30、序。假设 start 和 end 都在合理的取值范围。例如: 执行前:str=0123456;start=1 ;end=4 执行后:strr=0432156 要求在该函数中不使用新的数组,没有循环。注意:只需要编写递归函数 reverse,系统中已经设置好了main函数。预设代码前置代码view plaincopy to clipboardprint?1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.3. #include 4. int main( ) 5. char str100; 6. int start, end; 7. gets

31、(str); 8. scanf(%d%d, &start, &end); 9. reverse( str, start, end ); 10. printf(%sn, str); 11. return 0; 12. 13.14. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 01234562. 1 4以文本方式显示1. 04321561秒 64M 0 测试用例 6以文本方式显示以文本方式显示1秒 64M 0 1. 01234562. 6 101. 0123456测试用例 7

32、以文本方式显示1. 01234562. 0 10以文本方式显示1. 65432101秒 64M 0 /* PRESET CODE 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 s

33、tr, int start,int end ) int i=start,j=end,p=0; char temporary; while(strp!=0)p+;if(startp&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; strj=temporary; H17:高精度加减法(选作)成绩: 10 / 折扣: 0.8背景:计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法

34、等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。输入:输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。输出:对应着输入的每一行数据,输出计算的结果,每个结果占一行。测试输入期待的输出时间限制内存限制额外进程测试用例 1以文本方式显示1. 22. 213914+234661233. 32862934-23481243以

35、文本方式显示1. 236800372. 93816911秒 64M 0 测试用例 2以文本方式显示1. 3以文本方式显示1. 17194789110054663541秒 64M 0 2. 483291674192731231+12361872368127351233. 123129678463287562378-289356872648712364. 999999999+12. 1231007427760226911423. 1000000000测试用例 3以文本方式显示1. 112. 56789+567893. 45555+444454. 1+123455. 12345+16. 98765-

36、987607. 12345-98768. 12345-123459. 12345-1234610. 1-5432111. 0-012. 0+0以文本方式显示1. 1135782. 900003. 123464. 123465. 56. 24697. 08. -19. -5432010. 011. 01秒 64M 0 #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,

37、c1=0; int temp=0; char op; char str1001=0; char *result; scanf(%d,&n); result=(char *)malloc(501*n);/根据输入的n申请内存空间 *result=0; /*每次循环都要初始化*/ 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; else sn3=te

38、mp+48; c=0; /for while(n1=0) temp=a0n1-48; temp+=c; if(temp=10) sn3=48; c=1; else sn3=temp+48; c=0; n1-; n3-; /while n1 while(n2=0) temp=a1n2-48; temp+=c; if(temp=10) sn3=48; c=1; else sn3=temp+48; c=0; n2-; n3-; /while n2 if(c) strcat(result,1); strcat(result,s); strcat(result,n); /if op /*计算减法*/ e

39、lse /*保证减数大于被减数 *如果被减数大于减数,则交换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; else sn3=temp+58; c=1; /for while(n1=0) temp=a0n1-48; temp-=c; if(temp=0) sn3=temp+48; c=0; else sn3=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 i printf(%s,result); getch();

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!