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;ifor(inti=9;i>=0;i--)
for(intj=0;jprintf("\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