北理C语言学习知识课后复习及其规范标准答案2.doc

收藏

编号:2582012    类型:共享资源    大小:313.19KB    格式:DOC    上传时间:2020-04-22
8
金币
关 键 词:
北理 语言 学习 知识 课后 复习 温习 及其 规范 标准答案
资源描述:
.\ 34 北理工的恶龙 成绩: 10 / 折扣: 0.8 背景: 最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数杀死恶龙,于是找到你寻求帮助。 输入: 第一行 龙头数 n , 勇士人数 m ( 1<=n, m<=100 ) 接下来 n 行,每行包含一个整数,表示龙头的直径 接下来 m 行,每行包含一个整数,表示勇士的身高 l 输出: 如果勇士们能完成任务,输出校长需要花的最小费用;否则输 出 “ bit is doomed! ” 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1. 2 3↵ 2. 5↵ 3. 4↵ 4. 7↵ 5. 8↵ 6. 4↵ 以文本方式显示 1. 11↵ 1秒 64M 0 测试用例 2 以文本方式显示 1. 2 1↵ 2. 5↵ 3. 5↵ 4. 10↵ 以文本方式显示 1. bit is doomed!↵ 1秒 64M 0 #include void main() { int s=0,t,i,j,m,n,a[100],b[100],c[100]; for(i=0;i<=99;i++) a[i]=0,b[i]=0,c[i]=0; scanf("%d%d",&m,&n); for(i=0;i<=m-1;i++) scanf("%d",&a[i]); for(i=0;i<=n-1;i++) scanf("%d",&b[i]); if(m>n) printf("bit is doomed!\n"); else { for(i=0;i<=m-1;i++) for(j=i;j<=m-1;j++) {if(a[i]>a[j]) {t=a[i],a[i]=a[j],a[j]=t;}} for(i=0;i<=n-1;i++) for(j=i;j<=n-1;j++) {if(b[i]>b[j]) {t=b[i],b[i]=b[j],b[j]=t;}} t=0; for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) if(a[i]<=b[j]) {c[t]=b[j]; t++; b[j]=0; break;} if(t int sum(int m,int n) { int i; if(n==m) i=n; else i=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)); } H13:安全的密码(选做) 成绩: 5 / 折扣: 0.8 随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。 并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。 任务 林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。 应当按照以下的规则来判断密码是否安全: 1. 如果密码长度小于 6 位,则不安全 2. 如果组成密码的字符只有一类,则不安全 3. 如果组成密码的字符有两类,则为中度安全 4. 如果组成密码的字符有三类或以上,则为安全 通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。 输入 输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。 输出 针对每一个密码判断并输出它是否安全。对于不安全的密码输出 "Not Safe",对于中度安全的密码输出 "Medium Safe",对于安全的密码输出 "Safe" 输入样例 4 1234 abcdef ABC123 1#c3Gh 输出样例 Not Safe Not Safe Medium Safe Safe 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1. 10↵ 2. abcDEF↵ 3. ABC↵ 4. qw↵ 5. `↵ 6. ABCDEFGHIJKLMNOPQRST↵ 7. 12345678901234567890↵ 8. 1aB↵ 9. 1 B↵ 10. a X ↵ 11. qwe123%^&ABC↵ 以文本方式显示 1. Medium Safe↵ 2. Not Safe↵ 3. Not Safe↵ 4. Not Safe↵ 5. Not Safe↵ 6. Not Safe↵ 7. Safe↵ 8. Not Safe↵ 9. Safe↵ 10. Safe↵ 1秒 64M 0 #include #include char check(char s[]) { int strlength; strlength=strlen(s); int n[4]={0,0,0,0}; int kind=0,i; if(strlength<6) return n;//not safe else { for(i=0;i=0&&s[i]<=9)n[0]++; else if(s[i]>=A&&s[i]<=Z)n[1]++; else if(s[i]>=a&&s[i]<=z)n[2]++; else n[3]++; } for(i=0;i<4;i++) if(n[i]!=0)kind++; if(kind==1) return n;//not safe if(kind==2) return m;//Medium Safe return s;//Safe } } void main() { int N,i; char level; scanf("%d\n",&N); char str[50]; for(i=0;i #include void shengji(char str[]) { int n=strlen(str);//n=15 char newstr[19]; int i; for(i=0;i<6;i++) { newstr[i]=str[i];//前六位地址码(省地县三级) } for(i=8;i<17;i++)//newstr中的到第位 { newstr[i]=str[i-2]; } newstr[6]=1; char temp[4]; temp[0]=str[12]; temp[1]=str[13]; temp[2]=str[14]; temp[3]=\0; if(strcmp(temp,"996")==0||strcmp(temp,"997")==0||strcmp(temp,"998")==0||strcmp(temp,"999")==0) { newstr[7]=8; } else newstr[7]=9; //下面是校检码,0的ascii码值是 int Wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//权重 int S=0; for(i=0;i<17;i++) { S=S+Wi[i]*((int)(newstr[i])-48); } int y; y=S%11; switch(y) { case 0:newstr[17]=1;break; case 1:newstr[17]=0;break; case 2:newstr[17]=X;break; case 3:newstr[17]=9;break; case 10:newstr[17]=2;break; default: newstr[17]=(char)(12-y+48);break; } newstr[18]=\0; strcpy(str,newstr); } int IscheckedValid(char str[]) { int n=strlen(str);//n=18 int num[17];//保存前位 int i; for(i=0;i<17;i++)//保存前位 num[i]=(int)str[i]-48; //下面是校检码,0的ascii码值是 int Wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//权重 int S=0; for(i=0;i<17;i++) { S=S+Wi[i]*num[i]; } 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=(char)(12-y+48);break; } if(lastnum==str[17]) return 1; else return 0;//0表示不合法 } void run(char str[]) { int n=strlen(str); if(n==15) { shengji(str); printf("%s\n",str); } else if(n==18) { if(!IscheckedValid(str)) printf("Invalid\n"); else printf("Valid\n"); } else printf("Invalid\n"); } void main() { int n; scanf("%d\n",&n); char str[25]; for(int i=0;i=0)s[i]=c,i++; else if(c==-)sign=1; else if(p<0)p=i-1; for(j=i;j<=60;j++) s[j]=0; scanf("%d",&n); p+=n; if(sign)printf("-"); if(p<0) { p=-p-1; printf("0."); for(i=1;i<=p&&i<=8;i++) printf("0"); for(i=1;i<=8-p;i++) printf("%c",s[i-1]); } else { i=0; while(i<=p) { if(s[i]==0&&!flag&&i void main() { int n,i; scanf("%d",&n); for(i=2;n>1;) { if(n%i==0) { printf("%d\n",i);n/=i; } else i++; } } 38 回文字符串——递归 成绩: 5 / 折扣: 0.8 有一种特殊形式的字符串,其正反序相同,被称为“回文字符串”。例如LeveL就是一个回文字符串。 输入: 字符串 输出: Yes或者No 说明: 如输出Yes,说明输入的字符串是一个回文字符串 输出No,说明输入的字符串不是一个回文字符串 请使用递归算法实现。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1. LeveL↵ 以文本方式显示 1. Yes↵ 1秒 64M 0 #include #include int fun(char str[],int a,int b) { if(str[a]!=str[b]) return 0 ; else if(a==b||a+1==b&&str[a+1]==str[b]) return 1; else if(str[a]==str[b]) return 1&&fun(str,a+1,b-1); } void main() { char str[100]; scanf("%s",str); int n; n=strlen(str); switch(fun(str,0,n-1)) { case 1:printf("Yes\n");break; case 0:printf("No\n");break; } } 39 求最大公约数——递归 成绩: 5 / 折扣: 0.8 请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。 = m 当 m<=n 且 n mod m =0 GCD(N,M) = GCD(m,n) 当n int gcd(int n,int m) { if(m<=n&&n%m==0) return m; else if(n 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("1\n"); else printf("%0.6lf\n",fun(n)); } 42 子串反向——递归 成绩: 10 / 折扣: 0.8 请编写一个递归函数 reverse(char str[], int start, int end ) ,该函数的功能是将串 str 中下标从 start 开始到 end 结束的字符颠倒顺序。假设 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 str[100]; 6. int start, end; 7. gets(str); 8. scanf("%d%d", &start, &end); 9. reverse( str, start, end ); 10. printf("%s\n", str); 11. return 0; 12. } 13. 14. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1. 0123456↵ 2. 1 4↵ 以文本方式显示 1. 0432156↵ 1秒 64M 0 测试用例 6 以文本方式显示 1. 0123456↵ 2. 6 10↵ 以文本方式显示 1. 0123456↵ 1秒 64M 0 测试用例 7 以文本方式显示 1. 0123456↵ 2. 0 10↵ 以文本方式显示 1. 6543210↵ 1秒 64M 0 /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ #include int main( ) { char str[100]; int start, end; gets(str); scanf("%d%d", &start, &end); reverse( str, start, end ); printf("%s\n", 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(str[p]!=\0) p++; if(start=p) { j=p-1; for(;i<=j;i++,j--) { temporary=str[i]; str[i]=str[j]; str[j]=temporary; } } } H17:高精度加减法(选作) 成绩: 10 / 折扣: 0.8 背景: 计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。 你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。 输入: 输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。 输出: 对应着输入的每一行数据,输出计算的结果,每个结果占一行。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 1. 2↵ 2. 213914+23466123↵ 3. 32862934-23481243↵ 以文本方式显示 1. 23680037↵ 2. 9381691↵ 1秒 64M 0 测试用例 2 以文本方式显示 1. 3↵ 2. 483291674192731231+1236187236812735123↵ 3. 123129678463287562378-28935687264871236↵ 4. 999999999+1↵ 以文本方式显示 1. 1719478911005466354↵ 2. 123100742776022691142↵ 3. 1000000000↵ 1秒 64M 0 测试用例 3 以文本方式显示 1. 11↵ 2. 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-54321↵ 11. 0-0↵ 12. 0+0↵ 以文本方式显示 1. 113578↵ 2. 90000↵ 3. 12346↵ 4. 12346↵ 5. 5↵ 6. 2469↵ 7. 0↵ 8. -1↵ 9. -54320↵ 10. 0↵ 11. 0↵ 1秒 64M 0 #include #include #include #include "stdlib.h" void main() { int n=0,i=0,j=0,k=0,b=0; char a[3][500]={0}; int n1=0,n2=0; char s[500]={0}; int n3=0; int c=0,c1=0; int temp=0; char op; char str[1001]={0}; char *result; scanf("%d",&n); result=(char *)malloc(501*n);//根据输入的n申请内存空间 *result=\0; /*每次循环都要初始化*/ for(;i
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:北理C语言学习知识课后复习及其规范标准答案2.doc
链接地址:https://www.taowenge.com/p-2582012.html
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

收起
展开