山东科技大学OJ集锦

更新时间:2023-03-13 20:43:01 阅读量: 教育文库 文档下载

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

(1-2)

Description

计算两整数x和y(0

输入只有一行,格式见sample。 Output

输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample Sample Input x = 11, y = 3 Sample Output x + y : 14 x - y : 8 x * y : 33

x / y quotient: 3, remainder: 2 x ^ 2 : 121 y ^ 3 : 27 HINT

注意输入输出格式。了解C语言整数除法运算符的特点,并且没有求幂的运算符 #include

int main() {

int x,y;

0

scanf(\ printf(\ printf(\ printf(\

printf(\ printf(\ printf(\

return 0; } (1-3)

Description

从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。 Input

输入一个浮点型数据,有效数字不会超过十进制的6位。 Output

输出为两行。

第一行为圆的面积,第二行为圆的周长,格式见sample。 Sample Input

3

Sample Output Area: 28.260000 Perimeter: 18.840000 HINT

了解浮点类型的输入、输出和算术运算符 #include #define P 3.14 int main() {

float r,s,c;

scanf(\ s=P*r*r; c=2*r*P;

printf(\

printf(\ return 0; } (1-4)

Description

求3个数的平均值。 Input

输入只有一行,为3个较小的整数。 Output

输出为这3个整数的平均值,保留3位小数。 Sample Input 1 2 3

Sample Output 2.000 HINT

注意除法运算对整型数据和浮点型数据是不一样的 #include int main() {

int a,b,c; float Aver;

scanf(\ Aver=(a+b+c)/3.0; printf(\ return 0; } (1-5)

Description

给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。 要计算的外币有三种:美元、欧元、日元。 Input

输入有三行。

第一行依次为美元、欧元、日元外币汇率,用空格分开。汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。汇率浮动范围为(0,10000)。 第二行为外币金额x,第三行为人民币金额y。x,y均为整数,且0

输出为两行。

第一行为金额为x的美元、欧元、日元兑换成人民币的金额,用空格分开。 第二行为金额为y的人民币兑换成美元、欧元、日元的金额,用空格分开。 所有金额精确到小数点后两位。 Sample Input

668.5200 908.0685 7.9852 1500 1500

Sample Output

10027.80 13621.03 119.78 224.38 165.19 18784.75 HINT

了解浮点数据类型的精确度和输出控制。 #include int main() {

double x,y;

double a,b,c,i,j,k,l,m,n;

scanf(\ scanf(\ scanf(\ i=x/100*a; j=x/100*b; k=x/100*c; l=y/a*100; m=y/b*100; n=y/c*100;

printf(\ printf(\ return 0; } (1-6)

Problem F: 求字符的值

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 562 Solved: 373

[Submit][Status][Web Board] Description

从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。 Input

输入为3个字符。 Output

输出为3行。

每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。 Sample Input 0 A

Sample Output 048 060 030 032 040 020 065 101 041 HINT

了解字符值的存储和整型的关系。 #include int main() {

char a,b,c;

scanf(\ printf(\ printf(\ printf(\ return 0; } (1-7)

Problem G: 奇数还是偶数?

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 575 Solved: 455 [Submit][Status][Web Board] Description

输入一个整数,判读它是奇数还是偶数。 Input

输入只有一行,为一个100以内的正整数。 Output

输出为一行。

若输入为偶数则输出“even”,奇数输出“odd”。 Sample Input 30

Sample Output even

HINT

用整数运算可以解决,练习“?:”表达式。 #include int main() {

int a;

(0

printf(\ else

printf(\ return 0; } (1-8)

Problem H: 绝对值

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 840 Solved: 376 [Submit][Status][Web Board] Description

求整型数据和浮点型数据的绝对值。 Input

输入两个数,第一个是整数,第二个是浮点数。 Output

输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 Sample Input -1 1

Sample Output 1 1 HINT

求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人! #include #include #include int main() {

int a,c; double b,d;

scanf(\ c=abs(a);

d=fabs(b);

printf(\ return 0; } (1-9)

Problem I: 简单的打折计算

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 919 Solved: 435 [Submit][Status][Web Board] Description

商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input

输入只有一行,三个整数m、n和x,且0

输出金额,精确到分。 Sample Input 95 300 4

Sample Output 334.40 HINT

了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 #include int main() {

int m,x,n,a; float b;

scanf(\ 0

mn)

b=0.88*a; else

b=a;

printf(\ return 0; } (1-10)

Problem J: 判断闰年

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 939 Solved: 443 [Submit][Status][Web Board]

Description

输入一个正整数的年份,判断是否为闰年。 Input

输入只有一行,为一个10000以内的正整数。 Output

输出为一行。

若输入为闰年偶数则输出“Yes”,否则输出“No”。 Sample Input 2010

Sample Output No HINT

了解逻辑运算符和关系运算符。 #include int main() {

int a;

0

if (a%4==0&&a0!=0) printf(\ else if (a@0==0) printf(\ else

printf(\ return 0; } (1-11)

Description

GHacker最近痴迷于一个新上市的解谜游戏,其中一关的过关是破解一个字符串S。经过3天的冥思苦想,GHacker成功的搞明白了这其中的奥秘,把串S中的整数取出来求和,就可以过关了。但是GHacker的数学实在糟糕。他无法在短暂的时间内算出来,只好求助Jackie。Jackie观察到虽然每次出现的数字不同,但是其它的符号并不会变化。于是Jackie编写了一个非常短的程序,帮助GHacker把这一关过了。 Input

输入为串S,只有一行。 Output

串S中用非数字(0~9)分隔开的非负整数之和,不会超出int类型的数据范围。 Sample Input

`13?:[7514],54.487==\Sample Output 447899 HINT

scanf()可以解决这个问题,注意转义字符和格式控制字符。

#include int main() {

int a,b,c,d,e,f,g,h,i,j,k,s;

scanf(\%*c%d%*c%*c%d%*c%*c%*c%*c%d%*c%d%*c\ s=a+b+c+d+e+f+g+h+i+j+k; printf(\ return 0; } (1-12)

Problem L: 水仙花数

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 960 Solved: 534 [Submit][Status][Web Board] Description

如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input

一个整数x,100<=x<=999。 Output

x是水仙花数,则输出“YES”,否则为“NO”。 Sample Input 153

Sample Output YES 答案:

#include int main() {

int a,b,c,d,e; scanf(\ b=a/100;

c=(a-b*100)/10; d=(a-b*100-c*10);

e=b*b*b+c*c*c+d*d*d; if(a==e)

printf(\ else

printf(\ return 0; } (1-13)

Problem M: 求1+2+...+n=?

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 2023 Solved: 413 [Submit][Status][Web Board] Description

给定一个n,求出s = 1+2+3+...+n的值。 Input

输入只有一行,包含一个正整数n(n<=232)。 Output

输出一行,为1+2+...+n的值。 Sample Input 10

Sample Output 55 HINT

n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。 #include int main() {

unsigned long long n; scanf(\ if(n%2==0)

printf(\ else

printf(\ return 0; } (1-14)

Problem N: 2的多少次幂

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1022 Solved: 470 [Submit][Status][Web Board] Description

从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。 Input

一个非负有理数x,x在[0,2256]范围内。 Output

一个整数y。 Sample Input 1

Sample Output 0 HINT

看起来数据很大,但是用double完全可以存储。为什么?请研究下IEEE-754标准的浮点数

存储格式。这里要用到C语言标准库的数学函数。 #include #include int main() {

double x; int y;

scanf(\ y=log2(x); printf(\ return 0; }

第二次作业

(2_1)问题 A: 哪一行比较长

时间限制: 1 Sec 内存限制: 2 MB 提交: 625 解决: 252 [提交][状态][讨论版] 题目描述

读取两行字符串,按每行的长度从长到短输出。 输入

输入为两行,每行不会超过26个字符。 输出

输出为两行,按每行的长度从长到短输出。 样例输入 abcdefghijk

abcdefghijklmnopqrstuvwxyz 样例输出

abcdefghijklmnopqrstuvwxyz abcdefghijk 提示

了解字符串的存储和操作,了解gets()和scanf(\读入字符串的不同之处 #include #include int main() {

char s1[27],s2[27]; int a,b; gets(s1); gets(s2); a=strlen(s1); b=strlen(s2); if (a>=b) {

puts(s1); puts(s2); } else { puts(s2); puts(s1); }

return 0; }

(2_2 )> 题目描述

从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 输入

输入只有一行,为三个整数。 输出

按从小到大输出这三个数。 样例输入 15 10 20 样例输出 10 15 20 提示

用if语句判断各种情况可以解决这个问题。 #include int main() {

int a,b,c;

scanf(\ if (a>=b&&b>=c) printf(\ else if (a>=c&&c>=b) printf(\ else if (b>=c&&c>=a) printf(\ else if (b>=a&&a>=c) printf(\ else if (c>=b&&b>=a) printf(\ else printf(\ return 0; }

Append Code

(2_3) 题目描述

输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n

输入三个整数,依次为k、m、 n。 输出

从小到大输出符合题意的所有整数,两数之间用一个空格分开。 样例输入 15 2 3 样例输出

2 3 4 8 9 10 14 15 提示

难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 #include int main() {

int k,m,n,a,b,i,c,d;

scanf(\ if (m>n) c=m,d=n; else c=n,d=m; printf(\

for (i=d+1;i<=k;i++) { a=i%m; b=i%n; if (a==0&&b!=0||a!=0&&b==0) printf(\ }

printf(\ return 0; }

(2_4)Description

计算a+b,0<=a,b<1000。 Input

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output

每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20

Sample Output 3 30 HINT

OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。 #include int main() {

int a,b;

while(scanf(\ printf(\ return 0; }

Append Code

(2_5)问题 E: A+B Problem (II) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB 提交: 242 解决: 177 [提交][状态][讨论版] 题目描述

计算a+b,0<=a,b<1000。 输入

输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 输出

每行输出一个a+b的和,顺序与输入对应。 样例输入 2 1 2 10 20 样例输出 3 30 提示

#include int main() {

int a[1000],b[1000],N,i; scanf(\ for (i=1;i<=N;i++) scanf(\ for (i=1;i<=N;i++)

printf(\ return 0; }

N给出了测试样例数,用for循环处理方便。

(2_6)问题 F: A+B Problem (III) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB

提交: 250 解决: 154 [提交][状态][讨论版] 题目描述

计算a+b,0<=a,b<1000。 输入

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 输出

每行输出一个a+b的值,顺序与输入对应。 样例输入 1 2 10 20 0 0

样例输出 3 30 提示

练习break的使用。 #include int main() {

int a,b,sum;

while (scanf(\ { if (a==0&&b==0) break; else { sum=a+b; printf(\ } }

return 0; }

(2_7)问题 G: A+B Problem (IV) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB 提交: 284 解决: 151 [提交][状态][讨论版] 题目描述

计算a+b,0<=a,b<1000。 输入

输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 输出

每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 样例输入

1 2 10 20 15 35 样例输出 3 30 50 提示

由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。

#include int main() { int a,b,sum; scanf(\ printf(\ while (scanf(\ { sum=a+b;

printf(\ } }

(2_8)问题 H: n个数的最大值和最小值 时间限制: 1 Sec 内存限制: 2 MB 提交: 304 解决: 159 [提交][状态][讨论版] 题目描述

找出n个数中最大的数和最小的数,并将它们的值输出出来。 输入

输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。 输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 输出

输出为两行,格式见sample。 样例输入 3 0 1 -1 样例输出

The maximum number is 1. The minimum number is -1. 提示

分隔符是空格还是回车都是空白符,对scanf(\来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 #include int main()

{

int b,d,n,i,max,min; scanf(\ scanf(\ max=d; min=d;

for (i=2;i<=n;i++) {

scanf(\ if (b>=max) max=b; if (b<=min)

min=b; }

printf(\

printf(\ return 0; }

(2_9)问题 I: 成绩的等级

时间限制: 1 Sec 内存限制: 2 MB 提交: 425 解决: 153 [提交][状态][讨论版] 题目描述

把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing

不在0~100之间的输入是非法数据,输出“Error”。 输入

输入多行,每行一个整数。 输出

输入所对应的成绩等级。 样例输入 -1 81 92 35 68 72 100

样例输出

Error Good Excellent Failing Pass Average Excellent

提示 用switch语句解决这个问题比较方便。 #include int main() {

int score; while(scanf(\ { if (score<0||score>100) printf(\ else {

switch (score/10) { case 0: case 1: case 2: case 3: case 4: case 5: printf(\ case 6: printf(\ case 7: printf(\ case 8: printf(\ case 9: case 10: printf(\ } } }

return 0; }

(2_10)问题 J: 只有一个二元运算符的表达式运算 时间限制: 1 Sec 内存限制: 2 MB 提交: 334 解决: 138

[提交][状态][讨论版] 题目描述

编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。 输入

每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。 输入以a和b为0,且用一个空格分开结束。 输出

每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。 样例输入 33+5 8*9 2.2 1-6 17/3 9%3 0 0

样例输出 38 72

invalid op -5 5 0 提示

教材上有非常相似的例题可以参考。 #include int main() {

int a,b; char c;

while (scanf(\ { if (a==0&&c==32&&b==0) break; else { switch(c) { case '+': printf(\ break; case '-':

printf(\ break; case '*': printf(\ break; case '/': printf(\ break; case '%': printf(\ break; default : printf(\ break; } }

return 0; }

***(2_11)问题 K: 求100以内的素数 时间限制: 1 Sec 内存限制: 2 MB 提交: 612 解决: 197 [提交][状态][讨论版] 题目描述

素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 输入

输入为两个整数m和n,满足0<=m<=n<=100。 输出

从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。

输出的所有数在两行“=====”之间。 样例输入 2 12

样例输出 ===== 11 7 5 3 2

===== 提示

利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关

#include

int main() {

int m,n,i,j,N;

scanf(\ printf(\

for(i=n;i>1&&i>=m;i--) {

for(j=2;j<=i-1;j++) { N=1;

if(i%j==0) {

N=0; break; } } if(N)

printf(\ }

printf(\}

(2_12)问题 L: 摄氏——华氏温度转换表 时间限制: 1 Sec 内存限制: 2 MB 提交: 568 解决: 132 [提交][状态][讨论版] 题目描述

已知华氏温度F,转换为摄氏温度C的公式为C=(F-32)*5/9。

输出给定范围(从low到high)和步长(step)的摄氏——华氏温度转换表 输入

第1行若为“C->F”表示输出:摄氏——华氏温度转换表,若为“F->C”表示输出:华氏——摄氏温度转换表。

第2、3行为两个整数:high和low,其值在-100到200之间。 第4行为step,step精确到小数点后1位。 输出

输出第一行为C和F,分别表示摄氏和华氏,与小数点对齐。若输出摄氏——华氏温度转换表,则C在前、F在后;反之,则输出华氏——摄氏温度转换表。

从输出的第2行开始为从温度low到温度high(包括low和high)的转换表,温度输出精确到小数点后1位,表格被“->”分为两个宽度相同的部分,其它的测试样例也不会给出超出宽度的数据,格式详见sample。 样例输入 C->F -10 40 2.5

样例输出

C -> F -10.0 -> 14.0 -7.5 -> 18.5 -5.0 -> 23.0 -2.5 -> 27.5 0.0 -> 32.0 2.5 -> 36.5 5.0 -> 41.0 7.5 -> 45.5 10.0 -> 50.0 12.5 -> 54.5 15.0 -> 59.0 17.5 -> 63.5 20.0 -> 68.0 22.5 -> 72.5 25.0 -> 77.0 27.5 -> 81.5 30.0 -> 86.0 32.5 -> 90.5 35.0 -> 95.0 37.5 -> 99.5 40.0 -> 104.0 提示

输出格式可以通过sample分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是step是浮点数,某些浮点数是无法精确存储的,因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。 #include int main () {

double z,C,F,i,m,n; char a,b,c,d;

scanf(\ scanf(\ scanf(\ scanf(\ if(a=='C') {

printf(\ C -> F\\n\ for(i=m;i<=n+0.01;i=i+z) {

F=9*i/5+32;

printf(\ } }

else if(a=='F') {

printf(\ F -> C\\n\ for(i=m;i<=n+0.01;i=i+z) {

C=(i-32)*5/9;

printf(\ } }

return 0; }

*(2_13)问题 M: 1!+2!+?+k!=? 时间限制: 1 Sec 内存限制: 2 MB 提交: 758 解决: 205 [提交][状态][讨论版]

求1!+2!+?+k!=?(unsigned(无符号整型)k<=12) #include int main() {

int k,i,j;

unsigned int sum=0,a=1; scanf(\

for(i=1;i<=k;i++) {

for(j=i;j>=1;j--) a=a*j; sum=sum+a;

a=1;(将a置为1!) }

printf(\ return 0; }

题目描述

求1!+2!+?+k!=?,并判断是否溢出。 输入

输入为一个正整数k。 输出

若1!+2!+?+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+?+k!的结果。 样例输出 153 提示

如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?

#include int main() {

int k,i,j;

unsigned int sum=0,a=1; scanf(\ if(k<=12) {

for(i=1;i<=k;i++) {

for(j=i;j>=1;j--) a=a*j; sum=sum+a; a=1; }

printf(\ } else

printf(\ return 0; }

第三次作业

(3-1)A Description

给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。 Input

输入为多行,每行一个整数x,至读入EOF结束。 Output

每行输出x对应的二进制数值。 Sample Input 0 1 3 33 65535

Sample Output 0 1 11

100001

1111111111111111 HINT

本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;

也可以用位运算处理。 #include int main() {

int a[20],i,b;

while(scanf(\ {

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

a[i]=b%2; b=b/2; if(b==0) break; }

for(;i>=0;i--) printf(\ printf(\ }

return 0; }

兔子繁殖问题:

假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)? 这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。

输入 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。 输出 输出为n行,每行为第m个月后的兔子总数。 样例输入 6 1 2 3 4 5 10 样例输出 1 2 3 5 8 89

提示:可以先计算出菲波那契序列并存储下来,然后查询出每月兔子数。 #include int main() { int a[60]={1,1}; int i,n,m; for(i=2;i<60;i++)

a[i]=a[i-1]+a[i-2]; scanf(\ while(n--) {

scanf(\ printf(\

} return 0; }

(3-2)B Description

一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac): 1. Δ>0,有两个不等的实根; 2. Δ=0,有两个相同的实根; 3. Δ<0,有两个共轭的虚根。 Input

输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。当输入的a为0时,表示输入结束。 Output

每行输入的样例对应三行输出。 第一行输出为样例的编号。第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。第三行输出为所输入方程的根,分为三种情况:1. 若方程满足Δ>0,即有两不等实根x1、x2,则按大小顺序输出这两个实根。2. 若方程满足Δ=0,即有两相同实根x,则输出一个实根。3. 若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。 以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。 Sample Input 1 2 1 -1 2 -1 -5 2 -0.2 -3 2 0 3 0 12 2 4 4 0

Sample Output Case 1 :

x^2 + 2x + 1 = 0

only one real root : -1 Case 2 :

x^2 - 2x + 1 = 0 only one real root : 1 Case 3 :

5x^2 - 2x + 0.2 = 0 only one real root : 0.2 Case 4 :

3x^2 - 2x = 0

two real roots : 0, 0.666667 Case 5 :

3x^2 + 12 = 0

two imaginary roots : 2i, -2i Case 6 :

2x^2 + 4x + 4 = 0

two imaginary roots : -1+i, -1-i HINT

输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。另一个就是浮点数的精度控制,这一部分sample给出了例子。 值得注意的是,linux下gcc编译的浮点数运算结果有-0,这是OJ系统Judge端使用的系统;而windows XP下的minGW编译器和VC6不会产生-0,只会输出0;但windows 7下的minGW编译器是能够产生-0的(确实很诡异)。因此使用windows XP的同学忽略了对结果为0的检测,程序需要对结果为0的情况进行全面考虑,确保正确的输出0。这个问题卡了好些同学好几天。

关于是否会产生-0,输出表达式0.0/-1的结果就能测试出来。浮点数从负数方向运算出结果为0,则浮点值为-0是符合C语言浮点数运算规则的,目前尚不清楚windows XP系统不能产生-0的原因。 #include #include int main() {

double a,b,c,d,m,x1,x2,t,s; int i=1;

while(scanf(\{

if(a==0) break; if(a!=0)

{scanf(\if(a<0){a=-a;b=-b;c=-c;} printf(\i++; if(a==1)

printf(\

else printf(\if(b==0) ;

else if(b==1) printf(\else if(b==-1) printf(\

else printf(\if(c==0);

else printf(\printf(\m=b*b-4*a*c; d=sqrt(m); if(m>1e-12)

{x1=(-b-d)/(2*a);

x2=(-b+d)/(2*a);

if(fabs(x1)<1e-6) x1=0; if(fabs(x2)<1e-6) x2=0;

printf(\}

else if(fabs(m)<1e-12) {x1=-b/(2*a);

if(fabs(x1)<1e-6) x1=0;

printf(\if(x1==0) printf(\else printf(\else

{t=(-b)/(2*a);

s=sqrt(4*a*c-b*b)/(2*a); if(fabs(t)<1e-6) t=0; if(fabs(s)<1e-6) s=0;

printf(\if(t==0) ;

else printf(\if(t==0) {

if(s==1) printf(\else printf(\} else {

if(s==1) printf(\else printf(\}

printf(\

if(t!=0)printf(\if(s!=1) printf(\else printf(\}

printf(\} }

return 0; }

(3-3)C Description

辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。 两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于

如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 ? 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。

例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147: 1071 = 2 × 462 + 147.

然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 × 147 + 21.

再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: 147 = 7 × 21 + 0.

此时,余数是0,所以1071和462的最大公约数是21。 Input

输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。 Output

每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。 Sample Input 1 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36

Sample Output 1 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72 HINT

按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。

#include int main()

{

unsigned int a,b,m,n,p;

while(scanf(\ {

if(m>=n) {

a=m;b=n; } else {

a=n; b=m; }

if(b==0) {

printf(\ }

if(a!=0&&b!=0) {

while(a%b!=0) {

p=a%b; a=b; b=p; }

if(a%b==0)

printf(\ } }

return 0; } (3-4)D Description

计算若干整数的和,这些整数都是小于1000的非负整数。 Input

输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 Output

每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。 Sample Input 3 1 2 3

5 10 15 20 30 50 Sample Output

6 125 HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include int main() {

unsigned int n,a,i,sum;

while(scanf(\ {

sum=0;

for(i=1;i<=n;i++) {

scanf(\ sum+=a; }

printf(\ }

return 0; } (3-5)E

Description

计算若干整数的和,这些整数都是小于1000的非负整数。 Input

输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 Output

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 Sample Input 2

3 1 2 3

5 10 15 20 30 50 Sample Output 6 125 HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include int main() {

int M,N,a,i,j,sum; scanf(\ for(j=1;j<=M;j++) {

scanf(\ sum=0;

for(i=1;i<=N;i++) {

scanf(\ sum+=a; }

printf(\ }

return 0; } (3-6)F

Description

计算若干整数的和,这些整数都是小于1000的非负整数。 Input

输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。 Output

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 Sample Input 3 1 2 3

5 10 15 20 30 50 0

Sample Output 6 125 HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include int main() {

unsigned int N,i,sum,a; while(scanf(\ {

if(N==0) break; else {

sum=0;

for(i=1;i<=N;i++) {

scanf(\ sum+=a; }

printf(\

} }

return 0; } (3-7)G Description

计算若干整数的和,这些整数都是小于1000的非负整数。 Input

输入的第一行是一个整数M,后面有M个测试用例。每个测试用例以一个整数N开始,后面接着是N个整数。 Output

每组测试用例对应一行输出,为所给的N个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。 Sample Input 2

3 1 2 3

5 10 15 20 30 50 Sample Output 6 125 HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include int main() {

int M,N,a,i,j,sum; scanf(\ for(j=1;j

scanf(\ sum=0;

for(i=1;i<=N;i++) {

scanf(\ sum+=a; }

printf(\ }

scanf(\ sum=0;

for(i=1;i<=N;i++)

{

scanf(\ sum+=a; }

printf(\ return 0; } (3-8)H Description

“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。 Input

输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由6个整数组成,分别为“a,b,c/d,m,n”。满足0

每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot buy!”。两组测试数据之间用一个空行分隔开。 Sample Input

COCK,HEN,CHICK,MONEY,CHICKS 3,2,1/3,100,100 5,3,1/3,100,100 8,5,1/7,100,100 8,5,1/7,300,300 Sample Output

COCKS,HENS,CHICKS 0,40,60 5,32,63 10,24,66 15,16,69 20,8,72 25,0,75

COCKS,HENS,CHICKS 0,25,75 4,18,78 8,11,81 12,4,84 Cannot buy!

COCKS,HENS,CHICKS

8,40,252 HINT

本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通过在循环体内加计数器可以统计出循环的运行次数,当测试数据变大时,运行次数的增长会非常可观,这就是超时的原因了。 #include int main() {

int a,b,c,d,e=0,m,n,x,y,z,i;

scanf(\,CHICKS\

while(scanf(\ { i=1;

for(x=0;x<=m/a;x++) {

y=(m*d-c*n+c*x-a*d*x)/(b*d-c); z=n-x-y;

if(x>=0&&y>=0&&z>=0&&x*a+y*b+(z*c)/d==m&&(c*z)%d==0) {

i=2; if(i==2) {

printf(\ printf(\ }

printf(\ }

}

if(i==1) {

printf(\ printf(\ } printf(\ }

return 0; }

正解:

#include int main() {

long int m,n;

int x,y,z,a,b,c,d,num_x,mon,count,flag;

scanf(\,CHICKS\

while(scanf(\ {

flag = 0; count = 0;

num_x = m / a;

for(x = 0;x <= num_x;x++) {

y = (m*d+c*x-c*n-a*d*x)/(b*d-c); z = n-x-y;

mon = a*x+b*y+c*z/d;

if(mon==m&&(c*z)%d==0&&y>=0&&z>=0) {

count++; if(count==1)

printf(\ printf(\ flag=1; } }

if(flag==0) {

printf(\ }

printf(\ } } (3-9)I

Description 问题背景:

神棍队的神棍童鞋很喜欢和女盆友逛街。神棍节这天,他们照例去逛街,亲昵过程中忽然发现路边上围了好一圈人。好奇心大盛的神棍于是凑过去围观。原来那里有一个棍神,他出了一道题目,如果有人能够答对的话,他就会实现那个人的一个愿望。神棍心想,有个女盆友多么幸福,要是大家都有女盆友该有多好。于是神棍想要答出这个问题,然后许一个让大家都可以很快拥有自己的女盆友的愿望,顺便在女盆友的面前臭美一番。神棍扫了一眼题目,拿出贴身小电脑,巴拉巴拉几下就敲出了代码,解决了那个问题。大家都在为神棍欢呼。这是什么问题呢?你是否也有兴趣看看?如果AC了的话就可以跟魔法少女签订契约,成为魔法少女的奴隶喔! 问题描述:

某个数的立方如果以111结尾的话,我们就称其为“神棍数”,现在要你求第k大的“神棍数”是多少。 Input

多组case,以EOF结尾。

每个case一行,只包含一个整数k(1<=k<=1000000000000000000)。 Output

一个整数表示第k大的“神棍数” Sample Input 1

Sample Output 471 答案:

#include int main() {

unsigned long long int k;

while (scanf(\ if (k==1)

printf(\ else

printf(\ return 0; } (3-10)J Description

所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵: 8 1 6 3 5 7 4 9 2

魔方阵的规律如下:

从1~N*N的 各个数依次如下规则存放: (1) 1在第一行中间一列;

(2) 每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列);

(3) 如果上一个数在第一行,则下一个数在最后一行,列数加一; (4) 如果上一个数在最后一列,则下一个数在第一列,行数减一;

(5) 如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。 Input

输入包含多组数据,每组为一个小于100的正奇数。 Output

对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。 Sample Input 3

Sample Output

8 1 6 3 5 7 4 9 2

#include int main() {

int a,b, c, d,i,j; int s[100][100] ;

while(scanf(\ if(b%2!=0) {

for (i=0;i

s[0][d] = 1;

for(a=2;a<=b*b;a++) {

if(c-1>=0) {

if(d+1>b-1) {

c=c-1; d=0; } else {

if(s[c-1][d+1]!=0) c=c+1; else {

c=c-1; d=d+1; } } } else {

if(d+1>b-1) c=c+1; else {

c=b-1;

d=d+1; } }

s[c][d]=a; }

for(i=0;i

for(j=0;j

printf(\ else

printf(\ }

printf(\ }printf(\ }

return 0; }

第四次作业

Problem A: Sequence Problem : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 303 Solved: 53 [Submit][Status][Web Board] Description

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。 你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 Input

输入为多行,直到文件末尾结束。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。 Output

对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加??按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。 Sample Input 3 1 2 3

5 10 15 20 30 50 4 100 200 300 400

Sample Output 11 17 23 30 50 100 200 300 400 HINT

这里最少要用到一个数组来存数整数序列或整数序列的和。 #include int main() {

int M,N,j,i,temp;

while(scanf(\ {

int a[1000]={0},b[1000]={0}; for(i=0;i

if(scanf(\ {

for(i=0;i

if(M==0&&N==0) printf(\ else {

if(M>N) temp=M; else temp=N;

for(i=0;i

if(i==(temp-1))

printf(\ else

printf(\ } } } else

{if(M==0) printf(\ else {

for(i=0;i

{if(i==(M-1)) printf(\ else printf(\ }

break; } }

return 0;

}

Problem B: Sequence Problem (II) : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 404 Solved: 65 [Submit][Status][Web Board] Description

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。 你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 Input

输入的第一行为一个整数M(M>0),后面有M行输入。每行输入为不超过1000个整数的整数序列,每个整数序列的输入均以0结束。 Output

对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加??按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。 Sample Input 3

1 2 3 0

10 15 20 30 50 0 100 200 300 400 0 Sample Output 11 17 23 30 50 100 200 300 400 HINT

这里最少要用到一个数组来存数整数序列或整数序列的和。一个省事的做法是把数组定义的稍微大一点,因为有时你的程序可能会边界处理的不是太好。 #include int main() {

int M,N,i,j,k,temp; scanf(\

for(i=0;i<((M+1)/2);i++)

{ int a[10000]={0},b[10000]={0}; for(j=0;j<10000;j++) { scanf(\ if(a[j]==0) break; }

for(k=0;k<10000;k++)

{ if(i==((M+1)/2-1)&&(M%2!=0)) break; scanf(\ if(b[k]==0) break; }

if(k>j) temp=k; else temp=j;

if(j==0&&k==0) printf(\ else {

for(j=0;j

{if(j==(temp-1)) printf(\ else printf(\ }} }

return 0; }

Problem C: Sequence Problem (III) : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 351 Solved: 54 [Submit][Status][Web Board] Description

整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。

两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。 你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 Input

输入的第一行为一个整数M(M>0),后面有M行输入。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。 Output

对输入的整数序列两两相加:第1行和第2行相加、第2行和第3行相加??按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若最后序列不足两个,则视作补一个长度为0的整数序列相加。

值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。 Sample Input 3

3 1 2 3

5 10 15 20 30 50 4 100 200 300 400 Sample Output 11 17 23 30 50

110 215 320 430 50 100 200 300 400 HINT

这里最少要用到两个数组来存储整数序列。 Problem D: Matrix Problem : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 826 Solved: 202 [Submit][Status][Web Board] Description

求一个m×n阶矩阵A的转置矩阵AT。矩阵A的每个元素都在int类型的范围之内。 Input

输入的第一行为一个整数M(M>0),后面有M组输入数据。每组数据以两个正整数m和n开始,满足0

输出为多组,每组输出A的转置矩阵AT。矩阵的输出为:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。每两组输出之间用一个空行分隔开。 Sample Input 1 3 3 1 2 3 4 5 6 7 8 9

Sample Output 1 4 7 2 5 8 3 6 9 HINT

二维数组存储矩阵。 #include int main() {

int a[100][100]={0},M,m,n,i,j,k,b[100][100]={0}; scanf(\ for(k=0;k

scanf(\ for(i=0;i

scanf(\ for(j=0;j

b[j][i]=a[i][j];

if(i<(m-1))

printf(\ else

printf(\ }

if (k<(M-1)) printf(\ }

return 0; }

Problem E: Matrix Problem (II) : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 382 Solved: 99 [Submit][Status][Web Board] Description

求两个矩阵A、B的和。根据矩阵加法的定义,只有同阶的矩阵才能相加。可以确保所有运算结果都在int类型的范围之内。 Input

输入数据为多个矩阵,每个矩阵以两个正整数m和n开始,满足0

对输入的矩阵两两相加:第1个和第2个相加、第3个和第4个相加??按顺序输出矩阵相加的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。

若输入的矩阵不为偶数个,最后剩余的矩阵不产生任何输出。

不满足矩阵加法定义的数据输出“Not satisfied the definition of matrix addition!” 每两组输出之间用一个空行分隔开。 Sample Input 3 3 1 2 3 4 5 6 7 8 9 3 3 9 8 7 6 5 4 3 2 1 3 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1

0 0 0

Sample Output 10 10 10 10 10 10 10 10 10

Not satisfied the definition of matrix addition! HINT

矩阵的加法就是对应位置上的元素相加。 #include int main() {

int a[100][100]={0},b[100][100]={0},m,n,i,j,k,num1,num2,x,y; while(scanf(\ {

if(m==0&&n==0) break; else

{for(i=0;i

for(j=0;j

scanf(\ } }

scanf(\ if(x==0&&y==0) break; else {

for (i=0;i

for(j=0;j

scanf(\ }

if(m!=x||n!=y)

printf(\ else {

for(i=0;i

for(j=0;j

if(j==(n-1))

printf(\

else printf(\ }

}

} }

printf(\ }

return 0; }

Problem F: Matrix Problem (III) : Array Pratice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 201 Solved: 34 [Submit][Status][Web Board] Description

求两个矩阵A、B的乘积C=AB。根据矩阵乘法的定义,只有A的列数和B的行数相同才能相乘。可以确保所有运算结果都在int类型的范围之内。 Input

输入数据为多个矩阵(最少2个),每个矩阵以两个正整数m和n开始,满足0

对输入的矩阵两两相乘:第1个和第2个相乘、第1个和第2个相乘的结果和第3个相乘??按顺序输出矩阵相乘的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。

若前k个矩阵相乘的结果和第k+1个矩阵无法相乘(即不满足矩阵乘法定义),则输出“Not satisfied the definition of matrix multiplication!”。然后用第k+1个矩阵去和第k+2个矩阵相乘。最后一个矩阵只做乘数。

每两组输出之间用一个空行分隔开。 Sample Input 2 3 1 1 1 1 1 1 3 3 1 2 3 4 5 6 7 8 9 3 1 0 0 0 0 0

Sample Output 12 15 18 12 15 18 0 0

HINT

矩阵的乘法就是一行乘以一列加起来做一个元素。 第五次作业

Problem A: 求最大值和最小值

Time Limit: 1 Sec Memory Limit: 4 MB Submit: 391 Solved: 72 [Submit][Status][Web Board] Description

求出一些整数中的最大值和最小值。 Input

输入为多行,以EOF结束。每行为一个十进制的数字,全部由0~9组成,每行最长不超过1000个字符。有些数字会以0开头(不影响数值大小的前导0)。 Output

输出为输入中的最大值和最小值,格式见sample。 Sample Input 02 010 0012 012 23

Sample Output

The maximum value is : 23 The minimum value is : 2 HINT

由于输入已经超过64bit整数的数值上限,因此应该用字符串把输入存储下来,进行大小的判断。

#include #include #define N 1001 int main() {

char s1[N],s2[N],s3[N],max[N],min[N]; int len1,len2,a,b,c,i,j,m,n,x,flag=0; gets(s1);

len1=strlen(s1);

for(i=0,x=0;s1[i]!='\\0';i++) {

if(s1[i]=='0') x++;

else break; }

for(j=x;j

strcpy(max,s2); strcpy(min,s2); a=strlen(max); b=strlen(min);

while(gets(s1)!='\\0') {

len2=strlen(s1);

for(i=0,x=0;s1[i]!='\\0';i++) {

if(s1[i]=='0') x++;

else break; }

for(j=x;j

strcpy(max,s3); a=c; }

if(a==c) {

m=strcmp(max,s3); if(m<0) strcpy(max,s3); }

if(b>c) {

strcpy(min,s3); b=c; }

if(b==c) {

n=strcmp(min,s3); if(n>0)

strcpy(min,s3); } }

if(a!=0)

printf(\ else

printf(\ if(b!=0)

printf(\ else

printf(\ return 0; }

Problem B: 回文

Time Limit: 1 Sec Memory Limit: 4 MB Submit: 279 Solved: 83 [Submit][Status][Web Board] Description

“回文(Palindrome)”是指一个串和它的倒序串完全一样,例如“文言文”、“上海在海上”、“妈妈爱我,我爱妈妈”就是回文。

接下来,你要编写一个程序来判断一个串是不是\回文\。在这里,“回文”是指一个串中大小写不敏感的英文字母(a和A是同一个字母)和数字的顺序和逆序完全相同,其他字符(如空白符、标点和其他符号等)及所在位置被忽略。 Input

输入为多行,到文件末尾结束。每行为一个串,且不会超过1000个字符,且全部由可显示的ASCII码字符组成。 Output

当一个串中的字母和数字部分能够构成一个回文,即输出“Yes.”;否则输出“No.”。 Sample Input 123 2002 +0_0+ eye hello

Revilo P.Oliver Do you know? \

Dollars make men covetous, then covetous men make dollars. A man, a plan, a canal: Panama! Sample Output No. Yes. Yes. Yes. No. Yes. No. Yes. No. Yes. HINT

首先要考虑如何去除空白符(空格、回车、换行、制表符等),标点和各种符号(如“,!\”

和“#@<>{}”等),并且把串中的英文字符统一大小写,最后才能进行回文判定。 请注意,用gets()和scanf()判断文件尾的方法是不一样的。gets()函数的返回值请查阅C语言的语法手册。 #include #include #define N 1001 int main() { char s1[N],s2[N],s3[N],s4[N]; int i,j,len1; while(gets(s1)!=NULL) { for(i=0,j=0;s1[i]!=NULL;i++) { if((s1[i]>='a'&&s1[i]<='z')||(s1[i]>='A'&&s1[i]<='Z')||(s1[i]>='0'&&s1[i]<='9')) { s2[j]=s1[i]; j++; } } s2[j]='\\0'; for(i=0;s2[i]!=NULL;i++) { if(s2[i]>='A'&&s2[i]<='Z') s3[i]=s2[i]+32; else s3[i]=s2[i]; } s3[i]='\\0'; len1=strlen(s3); for(i=(len1-1),j=0;i>=0;i--,j++) s4[j]=s3[i]; s4[j]='\\0'; if(strcmp(s4,s3)==0) printf(\ else printf(\ } return 0; }

Problem C: Caesar密码

Time Limit: 1 Sec Memory Limit: 4 MB Submit: 340 Solved: 79 [Submit][Status][Web Board] Description

古罗马时,凯撒大帝为了能够确保他与远方的将军之间的通信不被敌人的间谍所获知,发明了Caesar密码。这是一种非常简单的加法替换密码。直到1915年,俄国军队仍在使用Caesar密码,当时军队人员素质不高,稍微复杂一点的密码就很难推广。对于奥地利和普鲁士军队的密码分析家来说,这种密码再简单不过了。

Caesar密码是利用下面的字母映射表进行加密的,第一行是加密前的字母(称作明文),第二行是加密后的字母(称作密文):

明文 a b c d e f g h i j k l m n o p q r s t u v w x y z

密文 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 容易发现,Caesar密码实际上是把字母表循环左移了3个字母后得到的,我们记作移位为3。 接下来,你要做一个程序,来实现与Caesar密码类似的加密算法。 Input

输入为多组数据。以一个整数m开头,后面有m组测试数据。

每组测试数据以两个整数n和k开头,后面接着有n行明文,每行明文总长度不超过10000个字符。只对明文中的大小写英文字母进行加密,其他的符号都忽略。k的取值在-25到26之间,表示密文字母相对明文字母的移位数,正数表示循环左移k个字母、负数表示循环右移k个字母。 Output

输出的结果与输入的明文顺序一致。每行明文的输出为两部分:先输出一个整数a,表示明文中有a个字符被加密,后面输出一个空格,然后输出密文,密文全部为大写字母,不输出任何其它字符。两组测试数据之间用一个空行分隔。 Sample Input 2 2 3

Love makes man grow up or sink down.

I love you not for who you are, but for who I am before you. 2 -4

Love makes man grow up or sink down.

I love you not for who you are, but for who I am before you. Sample Output

28 ORYHPDNHVPDQJURZXSRUVLQNGRZQ

44 LORYHBRXQRWIRUZKRBRXDUHEXWIRUZKRLDPEHIRUHBRX 28 HKRAIWGAOIWJCNKSQLKNOEJGZKSJ

44 EHKRAUKQJKPBKNSDKUKQWNAXQPBKNSDKEWIXABKNAUKQ HINT

输入的处理可能会产生一点小的困扰:当读完n和k时,如何去读下一行的字符串?scanf()函数是无法读取回车符号的,能够读出回车符的只有getchar()或gets()这类读取字符的函数。 请注意,用gets()和scanf()判断文件尾的方法是不一样的。gets()函数的返回值请查阅C语言的语法手册。

#include #include #define N 10001 int main() {

char s1[N],s2[N];

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

Top