北理C语言作业及问题详解2Word文件下载.docx

上传人:b****5 文档编号:19386169 上传时间:2023-01-05 格式:DOCX 页数:32 大小:34.50KB
下载 相关 举报
北理C语言作业及问题详解2Word文件下载.docx_第1页
第1页 / 共32页
北理C语言作业及问题详解2Word文件下载.docx_第2页
第2页 / 共32页
北理C语言作业及问题详解2Word文件下载.docx_第3页
第3页 / 共32页
北理C语言作业及问题详解2Word文件下载.docx_第4页
第4页 / 共32页
北理C语言作业及问题详解2Word文件下载.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

北理C语言作业及问题详解2Word文件下载.docx

《北理C语言作业及问题详解2Word文件下载.docx》由会员分享,可在线阅读,更多相关《北理C语言作业及问题详解2Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。

北理C语言作业及问题详解2Word文件下载.docx

%d%d"

&

m,&

n);

=m-1;

%d"

a[i]);

=n-1;

b[i]);

if(m>

n)

printf("

bitisdoomed!

\n"

);

else

for(j=i;

j<

j++)

{if(a[i]>

a[j])

{t=a[i],a[i]=a[j],a[j]=t;

}}

{if(b[i]>

b[j])

{t=b[i],b[i]=b[j],b[j]=t;

t=0;

for(j=0;

if(a[i]<

=b[j])

{c[t]=b[j];

t++;

b[j]=0;

break;

}

if(t<

m)

printf("

else

{for(i=0;

=t;

s=s+c[i];

%d\n"

s);

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

5/折扣:

哈哈!

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

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

功能:

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

=m。

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

累加和

要求:

使用递归算法完成。

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

1.110↵

1.Thesumfrom1to10is55.↵

1.1015↵

1.Thesumfrom10to15is75.↵

intsum(intm,intn)

inti;

if(n==m)

i=n;

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

return(i);

intm,n;

Thesumfrom%dto%dis%d.\n"

m,n,sum(m,n));

H13:

安全的密码(选做)

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

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

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

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

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

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

任务

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

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

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

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

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

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

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

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

输入

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

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

输出

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

对于不安全的密码输出"

NotSafe"

,对于中度安全的密码输出"

MediumSafe"

,对于安全的密码输出"

Safe"

输入样例

4

1234

abcdef

ABC123

1#c3Gh

输出样例

NotSafe

Medium

SafeSafe

1.10↵

2.abcDEF↵

3.ABC↵

4.qw↵

5.`↵

6.ABCDEFGHIJKLMNOPQRST↵

7.890↵

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↵

string.h>

charcheck(chars[])

{

intstrlength;

strlength=strlen(s);

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

intkind=0,i;

if(strlength<

6)return'

n'

;

//notsafe

else

strlength;

i++)

{

if(s[i]>

='

0'

&

s[i]<

9'

)n[0]++;

elseif(s[i]>

A'

Z'

)n[1]++;

a'

z'

)n[2]++;

elsen[3]++;

}

4;

if(n[i]!

=0)kind++;

if(kind==1)return'

if(kind==2)return'

m'

//MediumSafe

return'

s'

//Safe

}

voidmain()

intN,i;

charlevel;

scanf("

N);

charstr[50];

for(i=0;

N;

gets(str);

level=check(str);

switch(level)

case'

:

NotSafe\n"

MediumSafe\n"

Safe\n"

break;

H14:

的奥秘(选做)

背景

18位标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份》中做了明确的规定。

GB11643-1999《公民身份》为GB11643-1989《社会保障》的修订版,其中指出将原标准名称"

社会保障"

更名为"

公民身份"

,另外GB11643-1999《公民身份》从实施之日起代替GB11643-1989。

GB11643-1999《公民身份》主要容如下:

一、围

该标准规定了公民身份的编码对象、的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定。

二、编码对象

公民身份的编码对象是具有中华人民国国籍的公民。

三、的结构和表示形式

1、的结构

公民身份是特征组合码,由十七位数字本体码和一位校验码组成。

排列顺序从左至右依次为:

六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

2、地址码

表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

3、出生日期码

表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

4、顺序码

表示在同一地址码所标识的区域围,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5、校验码

(1)十七位数字本体码加权求和公式

S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和

Ai:

表示第i位置上的数字值

Wi:

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

7910584216379105842

(2)计算模

Y=mod(S,11)

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

Y:

012345678910

校验码:

10X98765432

四、举例如下:

市区:

X

省市:

4

15位的号升级办法:

15位的号:

ddddddyymmddxxp

18位的号:

ddddddyyyymmddxxpy

∙其中dddddd为地址码(省地县三级)

∙yyyymmddyymmdd为出生年月日

∙xx顺号类编码

∙p性别

15位的yy年升为18位后,变成19yy年,但对于百岁以上老人,则为18yy年,此时,他们的最后三位顺序码为996,997,998或999来标记。

输入

输入n组,第一行为个数,以后每行为。

输出

如果输入的为15位,则将其升级为18位后显示输出;

否则判断其是否为合法号,并逐行输出。

1.4↵

2.1↵

3.X↵

4.1002↵

5.1996↵

1.Invalid↵

2.Valid↵

4.5↵

voidshengji(charstr[])

intn=strlen(str);

//n=15

charnewstr[19];

6;

newstr[i]=str[i];

//前六位地址码(省地县三级)

for(i=8;

17;

i++)//newstr中的到第位

newstr[i]=str[i-2];

newstr[6]='

1'

chartemp[4];

temp[0]=str[12];

temp[1]=str[13];

temp[2]=str[14];

temp[3]='

\0'

if(strcmp(temp,"

996"

)==0||strcmp(temp,"

997"

998"

999"

)==0)

newstr[7]='

8'

elsenewstr[7]='

//下面是校检码,0的ascii码值是

intWi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

//权重

intS=0;

S=S+Wi[i]*((int)(newstr[i])-48);

inty;

y=S%11;

switch(y)

case0:

newstr[17]='

case1:

case2:

X'

case3:

case10:

2'

default:

newstr[17]=(char)(12-y+48);

newstr[18]='

strcpy(str,newstr);

intIscheckedValid(charstr[])

//n=18

intnum[17];

//保存前位

i++)//保存前位

num[i]=(int)str[i]-48;

S=S+Wi[i]*num[i];

charlastnum;

lastnum='

lastnum=(char)(12-y+48);

if(lastnum==str[17])

return1;

else

return0;

//0表示不合法

voidrun(charstr[])

if(n==15)

shengji(str);

%s\n"

str);

elseif(n==18)

if(!

IscheckedValid(str))

Invalid\n"

elseprintf("

Valid\n"

intn;

charstr[25];

for(inti=0;

n;

run(str);

36科学记数法

对于非常大或者非常小的数据,我们通常用科学记数法来表示。

例如在科技文献和电脑中经常遇到的2.3×

106(计算机中的科学记数法表示为:

2.3E6),或者9.18×

10-5(科学记树法表示:

9.18E-5)这种类型的数据。

用科学记数法表示的数据。

即为符合C语言表示的科学记数法表示。

该数据的双精度表示

说明:

输入数据的精度不高于小数点后50位。

输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。

结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理。

1.1.2345E3↵

1.1234.50000000↵

1.1.2345e-3↵

1.0.00123450↵

测试用例3

1.2.123456789e20↵

1.9123.45678900↵

测试用例4

1.1E0↵

1.1.00000000↵

测试用例6

1.2.90E1↵

1.22.34567890↵

#include"

stdio.h"

intmain()

intp=-1,n,i=0,j,sign=0,flag=0;

charc,s[100];

while(scanf("

%c"

c)&

c!

e'

E'

if(c=='

.'

)p=i-1;

elseif(c<

c>

)s[i]=c,i++;

elseif(c=='

-'

)sign=1;

elseif(p<

0)p=i-1;

=60;

j++)

s[j]='

p+=n;

if(sign)printf("

-"

if(p<

0)

p=-p-1;

0."

for(i=1;

=p&

=8;

0"

=8-p;

s[i-1]);

i=0;

while(i<

=p)

if(s[i]=='

!

flag&

p)i++;

else{flag=1;

s[i++]);

."

for(j=1;

37大数分解

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

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

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

一个正整数。

分解后的各个因子。

1.24↵

1.2↵

2.2↵

3.2↵

4.3↵

1.17↵

1.15↵

1.3↵

#include<

{intn,i;

for(i=2;

n>

1;

){

if(n%i==0){

i);

n/=i;

elsei++;

38回文字符串——递归

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

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

字符串

Yes或者No

如输出Yes,说明输入的字符串是一个回文字符串

输出No,说明输入的字符串不是一个回文字符串

请使用递归算法实现。

1.LeveL↵

1.Yes↵

intfun(charstr[],inta,intb)

if(str[a]!

=str[b])return0;

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

charstr[100];

%s"

n=strlen(str);

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

Yes\n"

No\n"

39求最大公约数——递归

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

=m当m<

=n且nmodm=0

GCD(N,M)=GCD(m,n)当n<

m时

=GCD(m,nmodm)其他

n和m

n和m的最大公约数

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

当前位置:首页 > 高等教育 > 艺术

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

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