北理C语言作业及答案3

更新时间:2024-06-28 05:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言作业3 43. 缩写展开

成绩: 10 / 折扣: 0.8

在保存字符串时,对出现在连续位置的若干个字符,如这些字符在ASCII表中也是连续出现,则可以将这些字符使用缩写形式进行保存,以节省保存空间。例如用A-Z表示ABCD...XYZ,1-5表示12345,c-f表示cdef。 输入:

包含缩写形式的字符串 输出:

将缩写形式进行还原后的字符串 说明:

只分别对大写字母、小写字母和数字进行压缩,对于形如9-A,a-C这样的缩写不进行处理。

时额间内存外限限制进制 程 164M 0 秒 测试输入 期待的输出 测以文本方式显示 试用1. 0-9? 例 1 测以文本方式显示 试用1. G-I? 例 2 测以文本方式显示 试用1. ABDG-K035-9abd-h? 例 以文本方式显示 1. 0123456789? 以文本方式显示 1. GHI? 164M 0 秒 以文本方式显示 1. ABDGHIJK0356789abdefgh? 164M 0 秒 3 测以文本方式显示 试用1. abcdef ghi jkl mn? 例 4 测以文本方式显示 试用1. 1-1? 例 5 以文本方式显示 1. abcdef ghi jkl mn? 164M 0 秒 以文本方式显示 1. 1-1? 164M 0 秒 #include int main() {

int i=0; char s[100]; gets(s); while(s[i]!='\\0') {

if(s[i+1]!='-') {

printf(\ i++; } else {

if(s[i+2]>s[i] && ((s[i]<=57)+(s[i+2]<=57)!=1) && (s[i]<=57||s[i]>=65)) {

while(s[i]!=s[i+2]){ printf(\ } i+=2; }

else printf(\ } } printf(\

return 0; }

44. 函数递归

成绩: 10 / 折扣: 0.8

编写一个函数,使用递归算法求满足下述定义的整数序列的第n项。 f( n ) =

1

f(n-1) + f(n-3) f(n-2) + f(n-4) -1

当 n >= 0 且 n <= 4 时 当 n > 4 且n为偶数 时 当 n > 4 且n为奇数 时 其他

函数原型如下:

int findf(int n);

参数说明:n 项数;返回值是第n项值。 例如输入:10,输出:8

预设代码

前置代码

view plaincopy to clipboardprint?

1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.

3. #include 4.

5. int main()

6. { int n,s, findf( int ); 7. scanf(\, &n); 8. s = findf(n);

9. printf(\, s); 10. return 0; 11. } 12.

13. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include int main(){ int n,s, findf( int ); scanf(\ s = findf(n); printf(\ return 0;}/* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 测试输入 期待的输出 时间限制 内存限制64M 额外进程0 以文本方式显示 以文本方式显示 无限制 测试用例 1 1. 10? 1. 8? int findf(int n) { if(n>=0&&n<=4) return 1; else if(n>4&&n%2==0) return findf(n-1) + findf(n-3); else if(n>4&&n%2==1) return findf(n-2) + findf(n-4); else return -1; }

45. 大家再来做游戏

成绩: 10 / 折扣: 0.8

还是那个大家做游戏的问题:

幼儿园的小朋友们刚学习了如何数数,阿姨在下课时组织大家一起玩游戏。规则如下:所有的小朋友绕成一圈,顺序排号,给出开始报数的小孩的编号后,从这个小朋友开始报数,凡是报到固定数字(例如5)的,都退出该游戏,接着从下一个小朋友在从1开始报数,直到只剩下一位小朋友游戏才中止。

输入: 小朋友的个数(<=50) 开始报数的小孩的编号 要被练习的数字 输出: 最终被留下的小朋友的序号 例如输入:4 1 3

输出:The left child is NO 1.

说明:这次,以函数的方式实现上述问题。主函数已经给出,仅需提交自己编写的函数。你可以尝试用递归方法来解决呦! 这个问题是著名的约瑟夫问题,基于著名犹太历史学家 Josephus讲述的一个,所以函数的名字是josephus。 函数原型:

int josephus( int * boy, int n, int m, int r) 参数说明:

int * boy:保存参加游戏的小孩编号的整型数组的首地址。小孩的编号从1开始。 int n:开始参加游戏的小孩总数。

int m:开始时第一次报数的小孩的编号。 int r:要被练习的数字。

预设代码

josephus.c

view plaincopy to clipboardprint?

1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.

3. #include \

4. int josephus( int *boy, int n, int m, int r ); 5.

6. int main( )

7. { int i, boy[50]={0}, n, m, r; 8. scanf(\,&n,&m,&r);

9. if( n<=0 || n>50 || m<=0 || m>50 || r<=0 ) 10. printf(\ ); 11. else 12. {

13. for( i=0; i

15. printf( \, josephus( boy, n, m, r ) ); 16. }

17. return 0; 18. } 19.

20. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include \int josephus( int *boy, int n, int m, int r );int main( ){ int i, boy[50]={0}, n, m, r; scanf(\ if( n<=0 || n>50 || m<=0 || m>50 || r<=0 ) printf(\ else { for( i=0; i1) { if((m+r-1)%n!=0) { for(j=(m+r-1)%n-1;j

}

H18:拱猪计分(选作)

成绩: 5 / 折扣: 0.8

背景:

拱猪是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。

1. 我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至 13来

代表A、2、…、Q、K等牌点,例如:H1为红心A,S13为黑桃K。

2. 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,

D11(羊)及C10(加倍)等16张牌。其它牌均弃置不计。若未持有这16张牌之任一张则以得零分计算。

3. 若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10 还有其

它计分牌,则将其它计分牌所得分数加倍计算。 4. 若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50, -2,-3,

-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。

5. 若红心牌H1至H13均在同一家,有下列情形:

o 所有红心牌以+200分计算。

o 若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。 o 而C10还是以前面所述原则计算之。 例一:若各玩家持有计分牌如下: ( 每列代表一玩家所持有之牌 ) S12 H3 H5 H13 D11 H8 H9

C10 H1 H2 H4 H6 H7 H10 H11 H12

则各家之得分依序为: -148 、 +83 、 -138 及 -60 。 例二:若各玩家持有计分牌如下:(第四家未持有任何计分牌) H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 S12 C10 D11

则各家之得分依序为: +200 、 -200 、 +100 及 0 。

例三:若有一玩家持有所有 16 张计分牌,则得 +1000 分。其余三家均得零分。

输入:

每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。相邻两组测试数据之间不会有空白行,读到四家持牌数都为 0 表示文件结束。

输出:

每一行输出一组测试数据对应的结果,依次输出各家所得分数,共四个整数 ( 含正负号,0 除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。

时间内存限额外限制进程制 1秒 64M 0 测试输入以文本方式显示 1. 2. 3. 4. 5. 期待的输出 测试用例 1 4 S12 H3 H5 H13? 3 D11 H8 H9? 6 C10 H1 H2 H4 H6 H7? 以文本方式显示 3 H10 H11 H12? 13 H1 H2 H3 H4 H5 H6 H7 1. -148 +83 -138 H8 H9 H10 H11 H12 H13? -60? 6. 2 S12 C10? 2. +200 -200 7. 1 D11? +100 0? 8. 0? 9. 0? 10. 0? 11. 0? 12. 0? #include \

int myinput(int card[],int number[]) {

int i,n; char s[5];

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

scanf(\ number[i]=n; while(n--) {

scanf(\ switch(s[0]) {

case 'S':card[13]=i;break; case 'D':card[14]=i;break; case 'C':card[15]=i;break;

case 'H':s[2]=='\\0'?(card[s[1]-'1']=i):(card[s[2]-'1'+10]=i); } } }

return number[0]+number[1]+number[2]+number[3]; }

int main() {

int

value[15]={-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40,-100,100}, card[16],

score[4]={0,0,0,0}, number[4], i,s, input();

while(myinput(card,number)) {

for(i=0,s=0;i<13;i++) s+=card[i]; if(s) {

for(i=0;i<15;i++)

score[card[i]]+=value[i]; } else {

if(card[0]==card[13]&&card[13]==card[14]) score[card[0]]+=500; else {

score[card[0]]+=200;

score[card[14]]+=value[14]; score[card[13]]+=value[13]; } }

score[card[15]]+=number[card[15]]==1?50:score[card[15]]; for(i=0;i<4;i++)

printf(\ for(i=0;i<4;i++) score[i]=0;

}

return 0; }

46 求表示方法

成绩: 10 / 折扣: 0.8

设 m、n 均为自然数,m 可表示为一些不超过 n 的自然数之和,f(m,n) 为这种表示方式的数目。

例如,f(5,3)=5,有5种表示方法:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1。 请编写程序,计算f(m,n)的值。 输入: m n 输出: f(m,n)的值

测试输入 期待的输出 时间限制 内存限制64M 额外进程0 以文本方式显示 以文本方式显示 1秒 测试用例 1 1. 5 3? 1. 5? 以文本方式显示 以文本方式显示 1秒 测试用例 2 1. 6 4? 1. 9? 64M 0 #include int f(int y,int x) {

if(y==1) return 1; if(x==1) return 1; if(y

if(x==y) return 1+f(y,x-1); return f(y,x-1)+f(y-x,x); }

main() {

int m,n;

scanf(\

printf(\}

#include int f(int y,int x) {

if(y==1) return 1; if(x==1) return 1; if(y

if(x==y) return 1+f(y,x-1); return f(y,x-1)+f(y-x,x); }

main() {

int m,n;

scanf(\ printf(\}

#include

char * search(char *str, char ch) {

char *A=NULL, *B=NULL; int Temp, Count=0; while(*str) {

if(*str == ch)

{ Temp = 0; A = str;

while(*str == ch) ++Temp, ++str; if(Temp > Count) Count = Temp, B = A; if(!*str) break;} ++str; }

return B; }

48.元素值之和

成绩: 5 / 折扣: 0.8

编写函数,计算给定的整型数组的奇数元素值之和、偶数元素值之和。

例如数组元素的值依次为: 1 , 8 , 2 , 3 , 11 , 6 ;则奇数值之和 15 、偶数值之和 16 。

函数原型: void findsum( int *pa , int n, int *podd, int *peven ) 。

参数说明: pa 是整型数组的首地址, n 是数组元素个数(元素个数不大于100),指针 podd 、 peven 保存奇数之和、偶数之和的整型变量的地址。 返回值:无返回值。

预设代码

findsum_48.c

view plaincopy to clipboardprint?

1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.

3. #include 4.

5. void findsum( int *pa, int n, int *podd, int *peven ); 6.

7. main( ) 8. {

9. int i, n, a[100], odd, even; 10. scanf( \,&n ); 11. for( i=0; i

13. findsum( a, n, &odd, &even );

14. printf(\, odd, even ); 15. } 16.

17. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include void findsum( int *pa, int n, int *podd, int *peven );main( ){ int i, n, a[100], odd, even; scanf( \ for( i=0; i

void findsum( int *pa, int n, int *podd, int *peven ) { int i; *podd=0; *peven=0; for(i=0;i

*podd=*podd+pa[i]; else *peven=*peven+pa[i];} }

#include

#include

#include

#define MAX 100

int run(char input[]) {

int length=strlen(input);//获得字符串长度

int i;

int k;

int m;

int mn;

int temp;

int num[MAX],j=0;

int w[10],iw=0;

for(i=0;i

for(i=0;i

if(input[i]=='*') {

temp=num[j-2]*num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='/') {

temp=num[j-2]/num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='+') {

temp=num[j-2]+num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='-')

{

temp=num[j-2]-num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]==' ')//空格表示一个数字输入完毕 {

mn=0;

for(m=iw-1;m>=0;m--) {

num[j]=num[j]+w[mn]*pow(10,m);

mn++; }

j++;iw=0; }

else

{ //int w[10],iw=0;

//num[j]=num[j]+(int)input[i]-48;

w[iw]=(int)input[i]-48;

iw++; }

}

return num[0]; }

void main() {

char input[MAX];

gets(input);

int result;

result=run(input);

printf(\ }

#include

#include

#include

#define MAX 100

int run(char input[]) {

int length=strlen(input);//获得字符串长度

int i;

int k;

int m;

int mn;

int temp;

int num[MAX],j=0;

int w[10],iw=0;

for(i=0;i

for(i=0;i

if(input[i]=='*') {

temp=num[j-2]*num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='/') {

temp=num[j-2]/num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='+') {

temp=num[j-2]+num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='-') {

temp=num[j-2]-num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]==' ')//空格表示一个数字输入完毕 {

mn=0;

for(m=iw-1;m>=0;m--) {

num[j]=num[j]+w[mn]*pow(10,m);

mn++;

}

j++;iw=0; }

else

{ //int w[10],iw=0;

//num[j]=num[j]+(int)input[i]-48;

w[iw]=(int)input[i]-48;

iw++; } }

return num[0]; }

void main() {

char input[MAX];

gets(input);

int result;

result=run(input);

printf(\

#include

#include

#define MAX 100

int run(char input[]) {

int length=strlen(input);//获得字符串长度

int i;

int k;

int m;

int mn;

int temp;

int num[MAX],j=0;

int w[10],iw=0;

for(i=0;i

for(i=0;i

if(input[i]=='*') {

temp=num[j-2]*num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='/') {

temp=num[j-2]/num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='+') {

temp=num[j-2]+num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp; }

else if(input[i]=='-') {

temp=num[j-2]-num[j-1];

j=j-2;

for(k=j+1;k

num[j]=temp;

}

else if(input[i]==' ')//空格表示一个数字输入完毕 {

mn=0;

for(m=iw-1;m>=0;m--) {

num[j]=num[j]+w[mn]*pow(10,m);

mn++; }

j++;iw=0; }

else

{ //int w[10],iw=0;

//num[j]=num[j]+(int)input[i]-48;

w[iw]=(int)input[i]-48;

iw++; } }

return num[0]; }

void main()

{

char input[MAX];

gets(input);

int result;

result=run(input);

printf(\ } }

49.为整数编号

成绩: 10 / 折扣: 0.8 使用以下结构 struct nn {

int no; int num; };

建立一个结构数组,从键盘输入若干个整数,保存在数组元素的num成员中,并根据输入的数按从小到大进行编号,将编号保存在no成员中。按整数的输入顺序输出整数及其编号。输入的整数不超过100个,每个整数的绝对值不大于1000,输入时以空格分隔整数。 例如输入:4 3 6 8 2 3 9 输出: 4 4 3 2 6 5 8 6 2 1 3 3 9 7

要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第2个整数为3,第6个整数也为3,则将先输入的整数3的编号在前,后输入的整数3的编号在后。编写函数完成为整数编号。

函数原型:int number( char *str, struct nn a[] ); 其中:str:保存以字符串方式接收的键盘输入, a: 保存整数及编号的结构数组的首地址, 函数返回值:已输入的整数的个数。

预设代码

前置代码

view plaincopy to clipboardprint?

1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.

3. #include 4. struct nn 5. { int no; 6. int num; 7. }; 8.

9. typedef struct nn DATA; 10.

11. int number( char * , DATA []); 12.

13. int main( ) 14. {

15. DATA b[100]; 16. char sa[500]; 17. int i, n; 18. gets( sa );

19. n = number( sa, b ); 20. for ( i=0; i

21. printf(\, b[i].num, b[i].no ); 22. return 0; 23. } 24.

25. /* Here is waiting for you

26. int number( char * str, DATA a[] ) 27. { 28. .... 29. } 30. */ 31.

32. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include struct nn{ int no; int num; };typedef struct nn DATA;int number( char * , DATA []);int main( ){ DATA b[100]; char sa[500]; int i, n; gets( sa ); n = number( sa, b ); for ( i=0; i

int count=0,X=0;

for (int i=0;str[i]!=0;i++) if (isdigit(str[i])) {

a[count].num=str[i]-'0'; count++; }

for (int i=0;i

{ X=count;

for (int j=0;j

if (a[i].num

if (a[i].num==a[j].num&&i

a[i].no=X; }

return count; }

50 学生成绩排序

成绩: 10 / 折扣: 0.8

大家参加了期末考试,成绩出来后老师要对 n 个学生进行成绩汇总和排序。要求程序按成绩降序进行排序。在排序过程中对于成绩相同的学生,要按照输入数据的顺序进行排列。例如:有5名学生的成绩: zhang1,90 zhang2,91 zhang3,99 zhang4,91 zhang5,98

则排序结果应该为: zhang3,99 zhang5,98 zhang2,91 zhang4,91 zhang1,90

请注意例题中“zhang2”和“zhang4”的排列顺序。

输入:

第一行为将要输入的学生数量n

从第二行起后面连续 n 行数据,每行为一名学生的姓名(长度不超过20个字符,不包括空格),考试成绩(int)

输出:

排序后的结果。每行为一名学生的姓名和成绩。

测试输入以文本方式显示 1. 2. 3. 4. 5. 6. 期待的输出以文本方式显示 1. 2. 3. 4. 5. 时间限制内存限制额外进程 1秒 64M 0 测试用例 1 5? zhang1,90? zhang2,91? zhang3,99? zhang4,91? zhang5,98? zhang3,99? zhang5,98? zhang2,91? zhang4,91? zhang1,90? 以文本方式显示 1. 2. 3. 4. 5. 6. 5? zhang31,90? zhang51,90? zhang2,90? zhang42,90? zhang1,90? 以文本方式显示 1. 2. 3. 4. 5. zhang31,90? zhang51,90? zhang2,90? zhang42,90? zhang1,90? 1秒 64M 0 测试用例 2 以文本方式显示 测试用例 3 1. 1? 2. wang,100? 以文本方式显示 1. wang,100? 1秒 64M 0 #include

struct student {

char name[20];

int score; };

void GetName(char name[]) {

int i=0;

char ch;

while((ch=getchar())!=',') {

name[i]=ch;

i++; }

name[i]='\\0'; }

void GetScore(int * score) {

scanf(\ }

void GetScoreLast(int * score) {

scanf(\ }

void sort(struct student stu[],int N) {

struct student * p;

struct student temp;

int i,j;

for(i=0;i

{

for(j=0;j

if(stu[j].score

temp=stu[j];

stu[j]=stu[j+1];

stu[j+1]=temp; } } } }

void print(struct student stu[],int N) {

int i;

for(i=0;i

printf(\ } }

void main() {

struct student stu[100];

int N,i;

scanf(\

for(i=0;i

GetName(stu[i].name);

if(i

GetScore(&stu[i].score);

else

GetScoreLast(&stu[i].score); }

sort(stu,N);

print(stu,N); }

H21:数码管(选作)

成绩: 10 / 折扣: 0.8

背景

数码管是一种廉价的十进制数字显示装置,它的基本工作原理是:一个数码管有 7 段,我们将它对应成八位二进制的 8 位。这 8 位的编号从左向右分别是 7、6、5、4、3、2、1、0。数码管的一段对应二进制的一位,如果要点亮某一段,则需要将相应的二进制位置 1,其余不亮的段要将对应的位置 0。下图表示了 7 个二进制在数码管上对应的位置:

2 +---+

3| |4 | 1 | +---+ 5| |6 | 0 | +---+

例如,我们要显示出数字“1”,则应该点亮数码管的第4和6段。这样对应的8位二进制数就是:0101 0000。如果用十六进方式表示出来就是 50。

同理,要显示出“3”,应该点亮:0、1、2、4、6;对应的二进表示为:0101 0111,用十六进制表示就是 57。

请编写一个程序,用 5 个数码管显示一个 16 位 (bit) 的正整数。

说明:如果需要显示的数据不足5位,则在数据前面补0。例如120要显示为00120。

输入

程序的输入是一系列 16 位(bit)的正整数(10进制形式),数与数之间允许用空白符隔开,当数字为 0 时程序结束。

输出

针对每个正整数,输出 5 个字节的十六进制数,它们可以表示 5 个数码管的状态。其中右侧第 1 个数表示输入数字的个位,第 2 个数表示十位,以此类推。

时间限制内存限制额外进程 1秒 64M 0 测试输入 期待的输出以文本方式显示 以文本方式显示 测试用例 1 1. 10103? 2. 30301? 3. 0? 1. 50 7D 50 7D 57? 2. 57 7D 57 7D 50? H21:数码管(选作)

成绩: 10 / 折扣: 0.8

背景

数码管是一种廉价的十进制数字显示装置,它的基本工作原理是:一个数码管有 7 段,我们将它对应成八位二进制的 8 位。这 8 位的编号从左向右分别是 7、6、5、4、3、2、1、0。数码管的一段对应二进制的一位,如果要点亮某一段,则需要将相应的二进制位置 1,其余不亮的段要将对应的位置 0。下图表示了 7 个二进制在数码管上对应的位置:

2 +---+ 3| |4 | 1 | +---+ 5| |6 | 0 | +---+

例如,我们要显示出数字“1”,则应该点亮数码管的第4和6段。这样对应的8位二进制数就是:0101 0000。如果用十六进方式表示出来就是 50。

同理,要显示出“3”,应该点亮:0、1、2、4、6;对应的二进表示为:0101 0111,用十六进制表示就是 57。

请编写一个程序,用 5 个数码管显示一个 16 位 (bit) 的正整数。

说明:如果需要显示的数据不足5位,则在数据前面补0。例如120要显示为00120。

输入

程序的输入是一系列 16 位(bit)的正整数(10进制形式),数与数之间允许用空白符隔开,当数字为 0 时程序结束。

输出

针对每个正整数,输出 5 个字节的十六进制数,它们可以表示 5 个数码管的状态。其中右侧第 1 个数表示输入数字的个位,第 2 个数表示十位,以此类推。

时间限制内存限制额外进程 1秒 64M 0 测试输入 期待的输出以文本方式显示 以文本方式显示 测试用例 1 1. 10103? 2. 30301? 1. 50 7D 50 7D 57? 3. 0? 2. 57 7D 57 7D 50? ins_list( PNODE h, int num ) {

PNODE zhu;

zhu=(NODE*)malloc(sizeof(NODE)); zhu->data=num; zhu->next=h->next; h->next=zhu; }

52 链表处理*

成绩: 10 / 折扣: 0.8

编写一个函数,给定的带有头结点的单向链表 head,给定某结点的数据域值 m,将该结点移到链首。 结构的定义:

typedef struct node {

int num;

struct node *next; } SNODE;

函数的原型:SNODE *movenode(SNODE *head, int m);

其中:参数 head 是单向链表的头指针;参数 m 是某结点的num成员的值。

例如输入结点数 n=7,则将结点数值域值 m=5 的结点移动到链首。函数运行前后链表的情况如下图所示。

预设代码

前置代码

view plaincopy to clipboardprint?

1. 2. 3. 4. 5. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include #include

6. typedef struct sdata 7. { int num;

8. struct sdata *next; 9. } SNODE; 10.

11. void movenode( SNODE *, int ); 12.

13. void setlink( SNODE * head, int n ) 14. {

15. SNODE *p; 16.

17. while ( n > 0 )

18. { p = ( SNODE * ) malloc( sizeof( SNODE ) ); 19. p->num = n;

20. p->next = head->next; 21. head->next = p; 22. n --; 23. } 24. } 25.

26. void outlink( SNODE * head ) 27. {

28. while( head->next != NULL ) 29. {

30. head = head->next;

31. printf( \, head->num ); 32. }

33. return; 34. } 35.

36. int main( ) 37. { int n, m;

38. SNODE * head = NULL; 39.

40. scanf(\, &n, &m );

41. head = ( SNODE * ) malloc( sizeof( SNODE ) ); 42. head->num = -1; 43. head->next = NULL; 44. setlink( head, n ); 45.

46. movenode( head, m ); /* This is waiting for you. */ 47.

48. outlink( head ); 49. printf(\);

50. return 0; 51. } 52. 53. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */ /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include #include typedef struct sdata{ int num; struct sdata *next;} SNODE;void movenode( SNODE *, int );void setlink( SNODE * head, int n ){ SNODE *p;while ( n > 0 ){ p = ( SNODE * ) malloc( sizeof( SNODE ) );p->num = n;p->next = head->next;head->next = p;n --;}} 测试输入 期待的输出 时间限制内存限制额外进程 无限制 64M 0 以文本方式显示 以文本方式显示 测试用例 1 1. 7 5? 1. 5,1,2,3,4,6,7,? 以文本方式显示 以文本方式显示 测试用例 2 1. 1 1? 1. 1,? 以文本方式显示 以文本方式显示 测试用例 3 1. 3 3? 1. 3,1,2,? 以文本方式显示 以文本方式显示 测试用例 4 1. 10 0? 1. 1,2,3,4,5,6,7,8,9,10,? 以文本方式显示 以文本方式显示 测试用例 5 1. 10 20? 1. 1,2,3,4,5,6,7,8,9,10,? 以文本方式显示 以文本方式显示 测试用例 6 1. 8 7? 1. 7,1,2,3,4,5,6,8,? 无限制 64M 0 无限制 64M 0 无限制 64M 0 无限制 64M 0 无限制 64M 0 以文本方式显示 以文本方式显示 测试用例 7 1. 8 2? 1. 2,1,3,4,5,6,7,8,? void movenode( SNODE *head, int m ) {

SNODE *q; SNODE *u; SNODE *v; SNODE *t; int i;

int count=0; t=head->next; while(t!=NULL) {

count++; t=t->next; }

if(count

q=(SNODE*)malloc(sizeof(SNODE)); q->next=head->next; q->num=m; head->next=q;

for(i=0,u=head;inext!=NULL;++i) u=u->next;

if(m>0&&u->next!=NULL) {

v=u->next;

u->next=v->next; free(v); } } }

无限制 64M 0 53 猜数字看人品

成绩: 10 / 折扣: 0.8

描述

Tom 和 Jerry 做猜数字的游戏,Tom 想一个数字然后让 Jerry 去猜,数字的范围在 1 到 10 之间。对于 Jerry 每讲的一个数,Tom 都要讲这个数是 too high 或者 too low 或者

right on,直到 right on 结束。为了防止 Tom 作弊,Jerry 把每一次的对话记录下来,现在让你去判断 Tom 有没有作弊。

输入

游戏可能做很多次,直到 Jerry 猜 0 的时候游戏结束,每一次猜测由一个正整数和一行回答组成。

输出

对每一次游戏如果 Tom 的回答有自相矛盾的地方,就输出 Tom is dishonest,否则输出 Tom may be honest。

时间限制内存限制额外进程 无限制 64M 0 测试输入 期待的输出 以文本方式显示 1. 5? 2. too low? 3. 7? 4. too high? 5. 6? 6. right on? 7. 10? 8. too high? 9. 3? 10. too low? 11. 4? 12. too high? 13. 2? 14. right on? 15. 0? 以文本方式显示 1. Tom may be honest? 2. Tom is dishonest? 测试用例 1 #include #include struct data{ int num; char s[10];

struct data *next; };

int judge () {

struct data *head,*p; int truth;

head=(struct data *)malloc (sizeof (struct data)); head->next=NULL; head->num=-1; p=head; while (1) {

p->next=(struct data *)malloc (sizeof (struct data)); p=p->next;

scanf (\if (p->num==0) return 0; scanf (\gets(p->s); if (p->s[0]=='r') {

truth=p->num; p->next=NULL; break; } }

p=head->next;

while (p->next!=NULL) {

if (p->num>=truth&&p->s[4]!='h'&&p->next!=NULL) return 1; else

if (p->num<=truth&&p->s[4]!='l'&&p->next!=NULL) return 1; p=p->next; }

return 2; }

int main() {

while (1) {

switch (judge()) {

case 0:goto end;

case 1:printf(\case 2:printf (\}

} end:; }

H22 恭喜发财 利是窦来(选做)

成绩: 5 / 折扣: 0.8

在中国,过春节时人们有给孩子压岁钱(粤语称为利是)的习俗。

最早的压岁钱出现于汉代,又叫压胜钱,并不在市面上流通,而是铸成钱币形式的玩赏物,有避邪的功能。钱币正面一般铸有“万岁千秋”、“去殃除凶”等吉祥话和龙凤、龟蛇、双鱼等吉祥图案。

据说嘉兴府有一户姓管的人家,夫妻老年得子,十分珍爱。在年三十晚上,为防止“祟”来侵扰 一直逗孩子玩,小孩用红纸包了八枚铜钱,包了又拆,拆了又包,睡下以后,包着的八枚铜钱就放在枕边。半夜里,一阵阴风吹过,黑矮的小人正要用他的白手摸孩 子的头,突然孩子枕边迸出一道金光,祟尖叫着逃跑了。

于是这件事传扬开来,大家纷纷效仿,在大年夜用红纸包上钱给孩子,祟就不敢再来侵扰了。因而人们把这种钱叫“压祟钱”,“祟”与“岁”发音相同,日久天长,就被称为 “压岁钱”了。

现在有 N 个人,他们都有小孩,春节来了,他们要发压岁钱给朋友的小孩,而他们自己的小孩也会收到压岁钱。为了简单,他们在发压岁钱的时候,使用以下的计算方法,譬 如某甲有 100 块,它要给另外三个人的小孩发压岁钱,则每个小孩会分到 100/3 = 33 块,剩余的 1 块就不发了。

给你这 N 个人的信息,以及他们把压岁钱发给了谁的小孩,请你计算他们每个人的小孩收到的压岁钱和他们发出去的压岁钱的差额是多少。

输入

第 1 行:

一个整数 N(2 <= N <= 10)

第 2..N+1 行: 每行是一个人名,每个名字不超过 14 个字符 第 N+2..结束: N 组按照以下规则组织的数据:

组中的第一行为送出压岁钱的人名。

第二行包括两个数字,第一个是该人有多少钱(0~2000),第二个是它要把钱发给几个人的小孩,用 NGi 表示(0 ≤ NGi ≤ N-1).

如果 NGi 为非零,则下面的 NGi 行会列出接受压岁钱的人的名字。

本文来源:https://www.bwwdw.com/article/elp3.html

Top