Recall2019BNUOJ
Posted leisureeen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Recall2019BNUOJ相关的知识,希望对你有一定的参考价值。
2019年本人在北京师范大学OJ系统上做了一些题目,现在回忆出来(代码不需要回忆,有记录,目前共8题)。
Primary Arithmetic
pid=1006
当你在小学学习算数的时候,老师会教你把两个数由右至左按位加起来。很多时候,加法过程中会出现进位。对于一部分孩子,理解这个“进位”在当时是很困难的事情。现在你的工作就是编写一个程序来判断两个数相加的过程中会产生多少次进位,用以确定这两个数相加的“难度”。
Input
每一行有两个无符号整数(最大不超过1000000000),当输入0 0的时候,程序结束。
Output
对于每一行的输入两个整数,你需要判断会产生有多少个进位,每一个输出占一行。
Sample Input
123 456 555 555 123 594 0 0
Sample Output
No carry operation. 3 carry operations. 1 carry operation.
Source
#include<stdio.h> int main(void) { int a=0,b=0; while(scanf("%d%d",&a,&b),a|b) { int n=0,cf=0; for(;a|b;a/=10,b/=10) if(a%10+b%10+cf>9) n++,cf=1; else cf=0; if(n) printf("%d",n); else printf("No"); printf(" carry operation"); if(n>1) putchar(‘s‘); puts("."); } return 0; }
最少比较次数
pid=1034
排序是计算机程序设计中最常用的操作之一,通常都是通过比较操作来完成排序。我们知道,要对一组整数进行排序,只要把它们两两进行一次比较,肯定能够完成。但是,其实这么多次比较并不都是必要的,例如,对A、B、C三个数进行排序,如果通过比较得到A>B、B>C,那么A和C之间的比较就是完全没有必要的了。
所以,我们常常只需要一部分比较结果,就能完成排序操作。
现在有n个整数,请问如果采用最佳的比较策略,至少需要多少次比较操作才能保证完成排序呢?
所以,我们常常只需要一部分比较结果,就能完成排序操作。
现在有n个整数,请问如果采用最佳的比较策略,至少需要多少次比较操作才能保证完成排序呢?
Input
输入包括多组数据,每组数据为一个整数n(1≤ n ≤ 5),表示需要排序的整数的个数。
如果n = 0则表示输入结束。
如果n = 0则表示输入结束。
Output
输入包括多组数据,每组数据为一个整数n(1≤ n ≤ 5),表示需要排序的整数的个数。
如果n = 0则表示输入结束。
如果n = 0则表示输入结束。
Sample Input
3 0
Sample Output
3
Hint
对于3个数排序,如果通过两次比较得到A>B、B>C,则不需要第三次比较,但是如果得到的是A>B、B<C,这A、C之间还需要一次比较。所以3个数的时候至少需要3次比较才能保证完成排序操作。
Source
Author
LiuLibo
#include<stdio.h> int main(void) { int n=0,key[]={0,1,3,5,7}; while(1) { scanf("%d",&n); if(!n) break; printf("%d ",key[n-1]); } return 0; }
转义字符
pid=1041
printf是C语言中最常用的输出函数。为了输出一些特殊字符,printf中定义了一些转义字符,但是如果想要输出这些转义字符,又需要将这些转义字符转义(囧RZ,好晕)。如果我们想输出下面这个字符串:
"ab%d
我们不能使用
printf(""ab%d");
输出上面的字符串,而应该改写为
printf("\"ab%%d");
根据经验,我们发现在我们使用的字符串中有下面几种字符需要被改写:
- 需要被改写为\
- "需要被改写为"
- %需要被改写为%%
给出串s,请输出按上述规则将s改写后所得的新串。
Input
输入第一行为一个整数n(0<n<=40),表示有n个串需要被改写。
接下来是n行,每一行为一个串s。s可能由字母、数字以及各种可见符号构成。s的长度不超100。
Output
对每一个串s,输出一行,为将s改写后的结果。
Sample Input
2 abc. "ab%.3d
Sample Output
abc. \"ab%%.3d
Source
#include<stdio.h> int main(void) { int n=0; char s[101]="",res[201]="",*p1=s,*p2=res; scanf("%d%*c",&n); while(n--) { gets(s); for(p1=s,p2=res;*p1;p1++) { if(*p1==‘%‘) *p2++=‘%‘,*p2++=‘%‘; else if(*p1==‘\‘) *p2++=‘\‘,*p2++=‘\‘; else if(*p1==‘"‘) *p2++=‘\‘,*p2++=‘"‘; else *p2++=*p1; } *p2=‘