北理C语言作业及答案2.docx

上传人:b****6 文档编号:6122050 上传时间:2023-01-04 格式:DOCX 页数:23 大小:47.57KB
下载 相关 举报
北理C语言作业及答案2.docx_第1页
第1页 / 共23页
北理C语言作业及答案2.docx_第2页
第2页 / 共23页
北理C语言作业及答案2.docx_第3页
第3页 / 共23页
北理C语言作业及答案2.docx_第4页
第4页 / 共23页
北理C语言作业及答案2.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

北理C语言作业及答案2.docx

《北理C语言作业及答案2.docx》由会员分享,可在线阅读,更多相关《北理C语言作业及答案2.docx(23页珍藏版)》请在冰豆网上搜索。

北理C语言作业及答案2.docx

北理C语言作业及答案2

34北理工的恶龙

成绩:

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<>

voidmain()

{

ints=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("bitisdoomed!

\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

printf("bitisdoomed!

\n");

else

{for(i=0;i<=t;i++)

s=s+c[i];

printf("%d\n",s);}

}

}

35杀鸡用牛刀——要用递归啊!

成绩:

5/折扣:

背景:

哈哈!

我们终于学了递归了,现在大家一定感到非常有意思吧,那个典型的“汉诺塔”问题,一个非常短的程序居然可以完成如此复杂的工作,真是神奇啊!

来吧,让我们也动手编写一个递归程序,当然,我们要编写的不可能太复杂。

功能:

求整数n到m区间的累加和,其中n<=m。

输入:

区间的起始点n区间的终止点m

输出:

累加和

要求:

使用递归算法完成。

如此简单的题目当然要有隐含的测试用例啦,就3个,看看谁能猜出来。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.110↵

1.Thesumfrom1to10is55.↵

1秒

64M

0

测试用例2

1.1015↵

1.Thesumfrom10to15is75.↵

1秒

64M

0

#include<>

intsum(intm,intn)

{

inti;

if(n==m)

i=n;

else

i=n+sum(m,n-1);

return(i);

}

voidmain()

{

intm,n;

scanf("%d%d",&m,&n);

printf("Thesumfrom%dto%dis%d.\n",m,n,sum(m,n));

}

H13:

安全的密码(选做)

成绩:

5/折扣:

随着电子设备的广泛运用,密码也渐渐融入每个人的生活。

保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。

一个安全的密码,最好由大小写字母、数字或符号组成。

包含越多种类的字符,其安全性就越高。

同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。

并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。

任务

林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。

现在他向你求助,请你帮忙设计一个程序来解决这个问题。

应当按照以下的规则来判断密码是否安全:

1.如果密码长度小于6位,则不安全

2.如果组成密码的字符只有一类,则不安全

3.如果组成密码的字符有两类,则为中度安全

4.如果组成密码的字符有三类或以上,则为安全

通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。

输入

输入的第一行是一个整数N,表明后面有多少组密码。

随后的N行输入包括N个密码,每个密码的长度均小于20个字符。

输出

针对每一个密码判断并输出它是否安全。

对于不安全的密码输出"NotSafe",对于中度安全的密码输出"MediumSafe",对于安全的密码输出"Safe"

输入样例

41234abcdefABC1231#c3Gh

输出样例

NotSafeNotSafeMediumSafeSafe

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.10↵

2.abcDEF↵

3.ABC↵

4.qw↵

5.`↵

6.ABCDEFGHIJKLMNOPQRST↵

7.4567890↵

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<>

charcheck(chars[])

{

intstrlength;

strlength=strlen(s);

intn[4]={0,0,0,0};

intkind=0,i;

if(strlength<6)return'n';.,16,先对前17位数字的权求和Ai:

表示第i位置上的身份证号码数字值Wi:

表示第i位置上的加权因子Wi:

7910584216379105842

(2)计算模

Y=mod(S,11)

(3)通过模得到对应的校验码

Y:

012345678910校验码:

10X98765432

四、举例如下:

北京市朝阳区:

1002X广东省汕头市:

440524

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.350622↵

3.1002X↵

4.02↵

5.96↵

1.Invalid↵

2.Valid↵

3.1002X↵

4.19965↵

1秒

64M

0

#include<>

#include<>

voidshengji(charstr[])

{

intn=strlen(str);S+WiS+Wi

1.

1.

1秒

64M

0

测试用例2

1.e-3↵

1.↵

1秒

64M

0

测试用例3

1.e20↵

1.9.↵

1秒

64M

0

测试用例4

1.1E0↵

1.↵

1秒

64M

0

测试用例6

1.E1↵

1.22.↵

1秒

64M

0

#include""

intmain()

{

intp=-1,n,i=0,j,sign=0,flag=0;charc,s[100];

while(scanf("%c",&c)&&c!

='e'&&c!

='E')

if(c=='.')p=i-1;

elseif(c<='9'&&c>='0')s[i]=c,i++;

elseif(c=='-')sign=1;

elseif(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

else{flag=1;printf("%c",s[i++]);}

}

printf(".");

for(j=1;j<=8;j++)

printf("%c",s[i++]);

}

printf("\n");

return0;

}

37大数分解

成绩:

5/折扣:

2007级在“计算机科学导论”的期末考试中有一道试题。

下面请你看看那题目应该如何编写。

从键盘输入的一个大于1的整数,通过算法将该整数分解为若干因子的乘积。

输入:

一个正整数。

输出:

分解后的各个因子。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.24↵

1.2↵

2.2↵

3.2↵

4.3↵

1秒

64M

0

测试用例2

1.17↵

1.17↵

1秒

64M

0

测试用例3

1.15↵

1.3↵

2.5↵

1秒

64M

0

测试用例4

1.3↵

1.3↵

1秒

64M

0

#include<>

voidmain()

{intn,i;

scanf("%d",&n);

for(i=2;n>1;){

if(n%i==0){

printf("%d\n",i);n/=i;

}

elsei++;

}

}

38回文字符串——递归

成绩:

5/折扣:

有一种特殊形式的字符串,其正反序相同,被称为“回文字符串”。

例如LeveL就是一个回文字符串。

输入:

字符串

输出:

Yes或者No

说明:

如输出Yes,说明输入的字符串是一个回文字符串输出No,说明输入的字符串不是一个回文字符串请使用递归算法实现。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.LeveL↵

1.Yes↵

1秒

64M

0

#include<>

#include<>

intfun(charstr[],inta,intb)

{

if(str[a]!

=str[b])return0;

else

if(a==b||a+1==b&&str[a+1]==str[b])return1;

else

if(str[a]==str[b])return1&&fun(str,a+1,b-1);

}

voidmain()

{

charstr[100];

scanf("%s",str);

intn;

n=strlen(str);

switch(fun(str,0,n-1))

{

case1:

printf("Yes\n");break;

case0:

printf("No\n");break;

}

}

39求最大公约数——递归

成绩:

5/折扣:

请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。

=m当m<=n且nmodm=0GCD(N,M)=GCD(m,n)当n

输入:

n和m

输出:

n和m的最大公约数

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.2448↵

1.24↵

1秒

64M

0

测试用例2

1.1315↵

1.1↵

1秒

64M

0

#include<>

intgcd(intn,intm)

{

if(m<=n&&n%m==0)

returnm;

else

if(n

else

returngcd(m,n%m);

}

voidmain()

{

intn,m;

scanf("%d%d",&n,&m);

printf("%d\n",gcd(n,m));

}

40求序列之和——递归

成绩:

5/折扣:

请使用递归算法求下列序列的前n项之和。

1+1/2-1/3+1/4-1/5......

输入:

n

输出:

序列的前n项和(精确到小数点之后第6位)

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.1↵

1.1↵

1秒

64M

0

测试用例2

1.2↵

1.↵

1秒

64M

0

测试用例3

1.3↵

1.↵

1秒

64M

0

#include<>

doublefun(intn)

{

if(n==1)return1;

if(n%2==0)returnfun(n-1)+n;

if(n%2==1)returnfun(n-1)n;

}

voidmain()

{

intn,m;

scanf("%d",&n);

if(n==1)

printf("1\n");

else

printf("%\n",fun(n));

}

42子串反向——递归

成绩:

10/折扣:

请编写一个递归函数reverse(charstr[],intstart,intend),该函数的功能是将串str中下标从start开始到end结束的字符颠倒顺序。

假设start和end都在合理的取值范围。

例如:

执行前:

str[]="0123456";start=1;end=4

执行后:

strr[]="0432156"

要求在该函数中不使用新的数组,没有循环。

注意:

只需要编写递归函数reverse,系统中已经设置好了main函数。

预设代码

前置代码

1./*PRESETCODEBEGIN-NEVERTOUCHCODEBELOW*/

2.

3.#include<>

4.intmain()

5.{charstr[100];

6.intstart,end;

7.gets(str);

8.scanf("%d%d",&start,&end);

9.reverse(str,start,end);

10.printf("%s\n",str);

11.return0;

12.}

13.

14./*PRESETCODEEND-NEVERTOUCHCODEABOVE*/

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.0123456↵

2.14↵

1.0432156↵

1秒

64M

0

测试用例6

1.0123456↵

2.610↵

1.0123456↵

1秒

64M

0

测试用例7

1.0123456↵

2.010↵

1.6543210↵

1秒

64M

0

/*PRESETCODEBEGIN-NEVERTOUCHCODEBELOW*/

#include<>

intmain()

{charstr[100];

intstart,end;

gets(str);

scanf("%d%d",&start,&end);

reverse(str,start,end);

printf("%s\n",str);

return0;

}

/*PRESETCODEEND-NEVERTOUCHCODEABOVE*/

voidreverse(charstr[],intstart,intend)

{

inti=start,j=end,p=0;

chartemporary;

while(str[p]!

='\0')

p++;

if(start

for(;i<=j;i++,j--)

{

temporary=str[i];

str[i]=str[j];

str[j]=temporary;

}

elseif(start=p)

{

j=p-1;

for(;i<=j;i++,j--)

{

temporary=str[i];

str[i]=str[j];

str[j]=temporary;

}

}

}

H17:

高精度加减法(选作)

成绩:

10/折扣:

背景:

计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。

但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。

你现在接受了一个任务,要编写一个高精度计算器的核心部分。

所谓高精度计算器,就是可以计算很大很大的数据的计算器。

输入:

输入的第一行是一个正整数,表示下面有几组数据需要计算。

之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多500个数字组成。

运算符可以是加号或者减号。

输出:

对应着输入的每一行数据,输出计算的结果,每个结果占一行。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例1

1.2↵

2.213914+↵

3.-↵

1.↵

2.9381691↵

1秒

64M

0

测试用例2

1.3↵

2.48329+735123↵

3.-6↵

4.9+1↵

1.466354↵

2.↵

3.00↵

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.↵

9.↵

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""

voidmain()

{

intn=0,i=0,j=0,k=0,b=0;

chara[3][500]={0};

intn1=0,n2=0;

chars[500]={0};

intn3=0;

intc=0,c1=0;

inttemp=0;

charop;

charstr[1001]={0};

char*result;

scanf("%d",&n);

result=(char*)malloc(501*n);//根据输入的n申请内存空间

*result='\0';

/*每次循环都要初始化*/

for(;i

{

//gets(str);

for(j=0;j<500;j++)

{

a[0][j]='\0';a[1][j]='\0';a[2][j]='\0';

s[j]='\0';

str[j]='\0';

str[1000-j]='\0';

}

c=0;c1=0;

k=0;

n1=0;n2=0;n3=0;

/*分离输入的字符串*/

scanf("%s",&str);

for(j=0;str[j];j++)

{

if(str[j]!

='+'&&str[j]!

='-')

a[k][j-n1]=str[j];

else

{

op=str[j];

k=1;

n1=strlen(a[0])+1;

}

}//forj

n1-=2;

n2=strlen(a[1])-1;

n3=n1>n2?

n1:

n2;

/*计算加法*/

if(op=='+')

{

for(;n1>=0&&n2>=0;n1--,n2--,n3--)

{

temp=a[0][n1]+a[1][n2]-96;

temp+=c;

if(temp>=10)

{

s[n3]=t

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1