C语言作业 2.docx
- 文档编号:22806821
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:23
- 大小:25.28KB
C语言作业 2.docx
《C语言作业 2.docx》由会员分享,可在线阅读,更多相关《C语言作业 2.docx(23页珍藏版)》请在冰豆网上搜索。
C语言作业2
28组成最大数
成绩:
10/折扣:
任意输入一个自然数,输出该自然数的各位数字组成的最大数。
例如,输入1593,则输出为9531。
输入:
自然数n
输出:
各位数字组成的最大数
测试输入
期待的输出
时间限制
内存限制
额外进程
测试用例1
1.1593
1.9531
1秒
64M
0
#include<>
#include<>
intmain(){
chara[10000];
intx[10]={0};
scanf("%s",a);
intn=strlen(a);
for(inti=0;i for(inti=9;i>=0;i--) for(intj=0;j printf("\n"); } 29北理工的恶龙 成绩: 10/折扣: 背景: 最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟,于是,校长下令召集全校所有勇士杀死这只恶龙。 要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。 而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。 校长想花最少的学分数杀死恶龙,于是找到你寻求帮助。 输入: 第一行龙头数n,勇士人数m(1<=n,m<=100)接下来n行,每行包含一个整数,表示龙头的直径接下来m行,每行包含一个整数,表示勇士的身高l 输出: 如果勇士们能完成任务,输出校长需要花的最小费用;否则输出“bitisdoomed! ” 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.23 2.5 3.4 4.7 5.8 6.4 1.11 1秒 64M 0 测试用例2 1.21 2.5 3.5 4.10 1.bitisdoomed! 1秒 64M 0 #include<> intmain() { intdragon,hero; scanf("%d%d",&dragon,&hero); intdragonhead[100]={0}; intherohight[100]={0}; 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. . .... .*.. .... 根据上面的地图,可以计算出应该提供给游戏者的数字如下所示: *100 2210 1*10 1110 每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。 输入 输入中将包括一系列的地图,每个地图的第一行有两个整数n和m(0 下面的n行每行都有m个字符,其中"."表示安全而"*"表示地雷。 如果地图的n和m都为0,则表示输入结束。 输出 针对每一个地图,首先输出一行: Field#x: 其中x是当前地图的编号(从1开始)。 下面的n行则将地图中的"."以数字表示,该数字表示该方格周围有多少颗地雷。 来源 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.44 2.*... 3..... 4..*.. 5..... 6.35 7.**... 8...... 9..*... 10.00 1.Field#1: 2.*100 3.2210 4.1*10 5.1110 6. 7.Field#2: 8.**100 9.33200 10.1*100 1秒 64M 0 测试用例2 1.33 2.... 3.... 4.... 5.33 6.*** 7.*** 8.*** 9.00 1.Field#1: 2.000 3.000 4.000 5. 6.Field#2: 7.*** 8.*** 9.*** 1秒 64M 0 #include<> voidprint(char*a,char*b,char*c,intn) { intcount=0; if(*b=='*')printf("*"); else { if(*a=='*')count++; if(*(a+1)=='*')count++; if(*(b+1)=='*')count++; if(*(c+1)=='*')count++; if(*c=='*')count++; printf("%d",count); } for(inti=1;i { count=0; if(*(b+i)=='*') printf("*"); else { if(*(a+i-1)=='*')count++; if(*(a+i)=='*')count++; if(*(a+i+1)=='*')count++; if(*(b+i-1)=='*')count++; if(*(b+i+1)=='*')count++; if(*(c+i-1)=='*')count++; if(*(c+i+1)=='*')count++; if(*(c+i)=='*')count++; printf("%d",count); } } printf("\n"); } intmain() { intflagn=0; intn,r; charempty[110]; for(inti=0;i<110;i++) empty[i]='.'; chara[110],b[110],c[110]; char*aa; aa=&a[0]; char*bb; bb=&b[0]; char*cc; cc=&c[0]; for(inti=1;1;i++) { for(intj=0;j<110;j++); printf("Field#%d: \n",i); print(aa,bb,cc,n); } else { printf("Field#%d: \n",i); gets(b); b[n]='.'; for(intj=0;j { gets(c); c[n]='.'; print(aa,bb,cc,n);.,16,先对前17位数字的权求和 Ai: 表示第i位置上的身份证号码数字值 Wi: 表示第i位置上的加权因子 Wi: 7910584216379105842 (2)计算模 Y=mod(S,11) (3)通过模得到对应的校验码 Y: 012345678910 校验码: 10X98765432 四、举例如下: 15位的身份证号升级办法: 15位的身份证号: ddddddyymmddxxp 18位的身份证号: ddddddyyyymmddxxpy ∙其中dddddd为地址码(省地县三级) ∙yyyymmddyymmdd为出生年月日 ∙xx顺号类编码 ∙p性别 15位的yy年升为18位后,变成19yy年,但对于百岁以上老人,则为18yy年,此时,他们的最后三位顺序码为996,997,998或999来标记。 输入 输入n组身份证号码,第一行为个数,以后每行为身份证号码。 输出 如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.4 2. 3. 4. 5. 1.Invalid 2.Valid 3. 4. 1秒 64M 0 #include<> #include<> intmod(int*p) { intresult; intsum; sum=*p*7+*(p+1)*9+*(p+2)*10+*(p+3)*5+*(p+4)*8+*(p+5)*4+*(p+6)*2+*(p+7)*1+*(p+8)*6+*(p+9)*3+*(p+10)*7+*(p+11)*9+*(p+12)*10+*(p+13)*5+*(p+14)*8+*(p+15)*4+*(p+16)*2; result=sum%11; returnresult; } intmain() { charinput[30]; intid[18]={0}; intchoice=0; intn; charbase[11]={'1','0','X','9','8','7','6','5','4','3','2'}; intx[11]={1,0,10,9,8,7,6,5,4,3,2}; inttemp; scanf("%d",&n); temp=getchar(); for(inti=0;i { gets(input); if(strlen(input)==15) choice=1; elseif(strlen(input)==18) choice=2; else { printf("Invalid\n"); continue; } switch(choice) { case1: { for(intk=0;k<6;k++) id[k]=input[k]-'0'; id[6]=1;id[7]=9; for(intk=8;k<17;k++) id[k]=input[k-2]-'0'; if((id[14]==9)&&(id[15]==9)&&(id[16]>5)) id[7]=8; id[17]=mod(id); for(intk=0;k<17;k++) printf("%d",id[k]); printf("%c",base[id[17]]); printf("\n"); break; } case2: { intflag=0; for(intk=0;k<17;k++) id[k]=input[k]-'0'; for(intq=0;q<17;q++) if(id[q]>9||id[q]<0) flag=1; intyear,month,day; year=id[6]*1000+id[7]*100+id[8]*10+id[9]; month=id[10]*10+id[11]; day=id[12]*10+id[13]*10; if(month>12) flag=1; if(year%4! =0&&month==2&&day>28) flag=1; if(year%4==0&&month==2&&day>29) flag=1; if(id[8]==8) flag=1; if(input[17]=='X'||input[17]=='x') id[17]=2; elseif(input[17]-'0'>9||input[17]-'0'<0) id[17]=-1; else id[17]=x[input[17]-'0']; if(mod(id)==id[17]&&flag==0) printf("Valid\n"); else printf("Invalid\n"); break; } } } } H12: 安全的密码(选做) 成绩: 5/折扣: 随着电子设备的广泛运用,密码也渐渐融入每个人的生活。 保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。 一个安全的密码,最好由大小写字母、数字或符号组成。 包含越多种类的字符,其安全性就越高。 同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。 并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。 任务 林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。 现在他向你求助,请你帮忙设计一个程序来解决这个问题。 应当按照以下的规则来判断密码是否安全: 1.如果密码长度小于6位,则不安全 2.如果组成密码的字符只有一类,则不安全 3.如果组成密码的字符有两类,则为中度安全 4.如果组成密码的字符有三类或以上,则为安全 通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。 输入 输入的第一行是一个整数N,表明后面有多少组密码。 随后的N行输入包括N个密码,每个密码的长度均小于20个字符。 输出 针对每一个密码判断并输出它是否安全。 对于不安全的密码输出"NotSafe",对于中度安全的密码输出"MediumSafe",对于安全的密码输出"Safe" 输入样例 4 1234 abcdef ABC123 1#c3Gh 输出样例 NotSafe NotSafe Medium SafeSafe 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.10 2.abcDEF 3.ABC 4.qw 5.` 6.ABCDEFGHIJKLMNOPQRST 7. 8.1aB 9.1B 10.aX 11.qwe123%^&ABC 1.MediumSafe 2.NotSafe 3.NotSafe 4.NotSafe 5.NotSafe 6.NotSafe 7.Safe 8.NotSafe 9.Safe 10.Safe 1秒 64M 0 #include<> #include<> intjudge(char*p,intn) { intresult=0; if(n<6) result=1; else { inta[4]={0,0,0,0}; for(inti=0;i { if((*(p+i)>='0')&&(*(p+i)<='9')) a[0]=1; elseif((*(p+i)>='a')&&(*(p+i)<='z')) a[1]=1; elseif((*(p+i)>='A')&&(*(p+i)<='Z')) a[2]=1; else a[3]=1; } result=a[0]+a[1]+a[2]+a[3]; } returnresult; } intmain() { chartemp; charwords[21]; intn=0; scanf("%d",&n); temp=getchar(); for(inti=0;i { for(intj=0;j<21;j++) words[j]='\0'; gets(words); switch(judge(words,strlen(words))) { case1: { printf("NotSafe\n"); break; } case2: { printf("MediumSafe\n"); break; } case3: case4: { printf("Safe\n"); break; } } } } H13: 编码问题(选作) 成绩: 5/折扣: 设有一个整形数组A[0..N-1];存放的元素为0~N-1(1 例如,当N=6时,有: A=(4,3,0,5,1,2)。 此时,数组A的编码定义如下: A[0]编码为0; A[i]编码为: 在A[0],A[1],…,A[i-1]中比A[i]的值小的个数(i=1,2,…,N-1) 例如上面数组A的编码为: B=(0,0,0,3,1,2) 若给出数组A,则可求出其编码。 同理,若给出数组A的编码,可求出A中的原数据。 输入: 推导方向(取值为1或2,如为1,则表示根据数组求数组编码;如为2,则表示根据编码反求数组) 数组个数 数组或数组编码元素 输出: 数组编码、或数组本身(元素之间以空格分隔) 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.1 2.6 3.430512 1.000312 1秒 64M 0 #include<> intmain() { intchoice; intn; scanf("%d%d",&choice,&n); intnum[10]={0}; intresult[10]={0}; for(inti=0;i {scanf("%d",&num[i]);} switch(choice) { case1: .,n,n+1,...,2n编号并在开始时保持着这种顺序。 一次洗牌就是将牌原来的次序变为n+1,1,n+2,2,...,2n,n,也就是将原来的前n张牌放到位置2,4,...,2n,并且将余下的n张牌按照他们原来的次序放到奇数位置1,3,...,2n-1。 已经证明对于任何一个自然数n,这2n张牌经过一定次数的洗牌就回到原来的次序。 但我们不知道对于一个特定的n,需要几次洗牌才能将牌洗回原来的次序。 输入: 牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数 输出: 将牌洗回原来的次序所需要的洗牌次数 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.10 1.6 1秒 64M 0 #include<> intmain() {intn,count=1; scanf("%d",&n); ints=2; for(count=1;s! =1;count++) {if(s<=n){s=2*s;} else{s=(s-n)*2-1;}} printf("%d\n",count);} 35科学记数法 成绩: 10/折扣: 对于非常大或者非常小的数据,我们通常用科学记数法来表示。 例如在科技文献和电脑中经常遇到的×106(计算机中的科学记数法表示为: ),或者×10-5(科学记树法表示: )这种类型的数据。 输入: 用科学记数法表示的数据。 即为符合C语言表示的科学记数法表示。 输出: 该数据的双精度表示 说明: 输入数据的精度不高于小数点后50位。 输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。 结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例1 1.E3 1. 1秒 64M 0 测试用例2 1.e-3 1. 1秒 64M 0 #include<> #include<> intintpow(inta,intb) { intresult=1; for(inti=0;i result=result*a; returnresult; } intmain() { charline[100]; intpe=0; intstart1=0,start2,end1,end2; intflag1=1,flag2=1; intlenth; inty=0; gets(line); for(inti=0;i<(int)strlen(line);i++) { if((line[i]=='')||(line[i]=='.')) { for(intj=i;j<(strlen(line)+1);j++) { line[j]=line[j+1]; } i=i-1; } } lenth=strlen(line); if(line[0]=='-') { start1=1; flag1=-1; } for(inti=0;i { if((line[i]=='e')||line[i]=='E') { pe=i; break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言作业 语言 作业