C语言程序设计—北京理工大学MOOC提交作业(1) 下载本文

第一周作业

【练习1】HelloWorld

成绩 折扣 0 开启时间 2014年10月21日 星期二 08:00 0.8 折扣时间 2014年12月7日 星期日 23:55 关闭时间 2014年12月7日 星期日 23:55 允许迟交 否 让我们学习用C语言向世界问好。 “Hello World”示例程序最早出现于1972年,由贝尔实验室成员Brian Kernighan撰写的内部技术文件《Introduction to the Language B》之中。不久同作者于1974年所撰写的《Programming in C: A Tutorial》,也延用这个示例。

一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。将“Hello World”作为第一个示范程序,已经成为编程语言学习的传统。

我们在这里继续传统,这也是一种向前辈们致敬的方式之一吧! 最早的程序基本是这个样子的: #include int main() {

printf(\Hello world.\\n\); return 0; }

请模仿上面的程序,看看是否可以通过编译?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。 略

第二周作业

【练习2】学学scanf和printf的用法吧

成绩 折扣 0 开启时间 2014年10月21日 星期二 08:00 0.8 折扣时间 2014年12月7日 星期日 23:55 关闭时间 2014年12月7日 星期日 23:55 允许迟交 否 该如何处理 double 型的数据:如何定义变量类型?如何使用 scanf 函数?

如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2 π r h ,体积 v=π r 2 h 。其中 π=3.1415926。 输入:

第一行输入圆柱的底面半径 r 第二行输入圆柱的高 h

输出:

s=< 圆柱的侧面积 >,v=< 圆柱的体积 > 要求

1. 所有变量都定义为双精度类型 2. 结果精确到小数点后两位。 作为练习题目:

我们已经给您编写好了大部分的代码,请您自己修改几个地方,完成程序的剩余部分。 **********************************************分隔线************ #include

#define PAI 3.1415926 int main() {

int r,h; double s,v;

scanf(\ ); s=2*PAI*r*h; v=PAI*r*r*h;

printf(\ \\n\ ); return 0; }

**********************************************分隔线************

Code:

#include

#define PAI 3.1415926 int main() {

int r,h; double s,v;

scanf(\ s=2*PAI*r*h; v=PAI*r*r*h;

printf(\ return 0; }

第三周作业

1、输出字符的 ASCII 码

成绩 折扣 10 开启时间 2014年10月21日 星期二 10:00 0.8 折扣时间 2014年11月5日 星期三 23:55 关闭时间 2014年11月12日 星期三 23:55 允许迟交 否 背景: 我们在计算机基础中已经学过:字母在计算机中采用ASCII码进行存储。下面要从键盘上输入任意一个字符,然后输出该字符对应的ASCII码。 输入: 一个字符 输出:

该字符对应的ASCII码

测试输入 测试用例 1 以文本方式显示 1. A? 以文本方式显示 1. The ASCII of character 'A' is 65.? 1秒 期待的输出 时间限制 内存限制 64M 0 额外进程 测试用例 2 以文本方式显示 1. Z? 以文本方式显示 1. The ASCII of character 'Z' is 90.? 1秒 64M 0 测试用例 3 以文本方式显示 以文本方式显示 1. The ASCII of character '0' is 48.? 1秒 64M 0 测试输入 期待的输出 时间限制 内存限制 额外进程 1. 0? 测试用例 4 以文本方式显示 1. 1? 以文本方式显示 1. The ASCII of character '1' is 49.? 1秒 64M 0 测试用例 5 以文本方式显示 1. +? 以文本方式显示 1. The ASCII of character '+' is 43.? 1秒 64M 0 Code:

#include int main() {

char ch;

scanf(\

printf(\ return 0; }

2、一年级的算术题

成绩 折扣 10 开启时间 2014年10月21日 星期二 10:00 0.8 折扣时间 2014年11月5日 星期三 23:55 关闭时间 2014年11月12日 星期三 23:55 允许迟交 否 背景:

小明上小学一年级了,老师已经教会了他们进行整数的 +、-、*、/、% 计算,下面老师开始出题,给出一个简单的算术表达式,请小明给出计算结果。

输入:

接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444 输出:

分别输出按照整型数据进行 +、-、*、/、* 之后的运行结果。

测试输入 期待的输出 时间限制 测试用例 1 以文本方式显示 1. 10 3? 1. 2. 3. 4. 5. 10+3=13? 10-3=7? 10*3=30? 10/3=3? 10%3=1? 以文本方式显示 1秒 64M 内存限制 0 额外进程 测试用例 2 以文本方式显示 1. 11 -3? 以文本方式显示 1. 2. 3. 4. 5. 11+-3=8? 11--3=14? 11*-3=-33? 11/-3=-3? 11%-3=2? 1秒 64M 0 Code #include int main() {

int a, b;

char ch = 37;

scanf(\

printf(\ printf(\ printf(\ printf(\

printf(\ return 0;

}

3、判断三角形的形状

成绩 折扣 10 开启时间 2014年10月21日 星期二 10:00 0.8 折扣时间 2014年11月5日 星期三 23:55 关闭时间 2014年11月12日 星期三 23:55 允许迟交 否 要求

输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。

输入:

三角型的3条边的长度(int型)。

输出:

等边三角形:equilateral triangle 等腰三角形:isoceles triangle 不构成三角形:non-triangle 一般三角形:triangle

测试输入

期待的输出

时间限制

测试用例 1

1.

2 2 2?

1.

equilateral triangle.?

以文本方式显示 以文本方式显示

1秒

内存限制64M

额外进程0

测试用例 2

以文本方式显示 以文本方式显示 1.

3 2 2?

1.

isoceles triangle.?

1秒 64M 0

测试用例 3

以文本方式显示 以文本方式显示 1.

1 3 1?

1.

non-triangle.?

1秒 64M 0

测试用例 4

以文本方式显示 以文本方式显示

1秒 64M 0

测试输入 期待的输出

时间限制

内存限制

额外进程

1. 3 4 5? 1. triangle.?

测试用例 5

以文本方式显示 以文本方式显示 1.

2 3 2?

1.

isoceles triangle.?

1秒 64M 0

测试用例 6

以文本方式显示 以文本方式显示 1.

2 2 3?

1.

isoceles triangle.?

1秒 64M 0

测试用例 7

以文本方式显示 以文本方式显示 1.

3 1 1?

1.

non-triangle.?

1秒 64M 0

测试用例 8

以文本方式显示 以文本方式显示 1.

1 1 3?

1.

non-triangle.?

1秒 64M 0

测试用例 9

以文本方式显示 以文本方式显示 1.

5 4 3?

1.

triangle.?

1秒 64M 0

测试用例 10

以文本方式显示 以文本方式显示 1.

4 5 3?

1.

triangle.?

1秒 64M 0

Code

#include int main() {

int a, b, c;

scanf(\ if(a + b > c && a + c > b && b + c >a) { if(a == b && a == c && b == c) {

printf(\ return 0; } if(a == b || a == c || b == c) { printf(\ return 0; } printf(\ } else { printf(\ }

return 0; }

第四周作业

1.【中学】计算时钟的夹角

成绩 10 开启时间 2014年10月28日 星期二 08:25 折扣 0.8 折扣时间 2014年11月12日 星期三 08:25 允许迟交 否 关闭时间 2014年11月19日 星期三 08:25 背景:钟面上的时针和分针之间的夹角总是在 0 ~180之间 ( 包括 0 和180 ) 。举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为180 ,在三点的时候为90 。本题要解决的是计算 12:00 到 11:59 之间任意一个时间的夹角。 输入:

每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。 输出:

对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。

再看一看,想一想:是否可以不用if 语句,只使用 printf 函数来简化你的程序?

测试输入 期待的输出 时内存额间限制外限 进制程 1秒 64M 0 测试用例 1 测试用例 2 测试用例 3 测试用例 4 测试用例 5 测试用例 以文本方式显以文本方式显示 示 1. 12 0? 1. At 12:00 the angle is 0.0 degrees.? 以文本方式显以文本方式显示 示 1. 12 30? 1秒 64M 0 1. At 12:30 the angle is 165.0 degrees.? 1秒 64M 0 以文本方式显以文本方式显示 示 1. 6 0? 1. At 6:00 the angle is 180.0 degrees.? 以文本方式显以文本方式显示 示 1. 3 0? 1. At 3:00 the angle is 90.0 degrees.? 1秒 64M 0 以文本方式显以文本方式显示 示 1. 3 3? 1. At 3:03 the angle is 73.5 degrees.? 以文本方式显示 以文本方式显示 1. At 3:09 the angle is 40.5 degrees.? 1秒 64M 0 1秒 64M 0 测试输入 期待的输出 时内存额间限制外限 进制程 6 1. 3 9? 测试用例 7 测试用例 8 测试用例 9 测试用例 10 以文本方式显以文本方式显示 示 1. 4 0? 1. At 4:00 the angle is 120.0 degrees.? 1秒 64M 0 1秒 64M 0 以文本方式显以文本方式显示 示 1. 5 59? 1. At 5:59 the angle is 174.5 degrees.? 以文本方式显以文本方式显示 示 1. 4 20? 1. At 4:20 the angle is 10.0 degrees.? 1秒 64M 0 以文本方式显以文本方式显示 示 1. 0 0? 1. At 0:00 the angle is 0.0 degrees.? 1秒 64M 0 Code

#include int main() {

int hour, minute, temp;

float angle, h_angle, m_angle; scanf(\ temp = hour;

if(hour == 12) temp = 0;

h_angle = temp * 30.0 + minute * 0.5; m_angle = minute * 6.0;

angle = h_angle > m_angle ? h_angle - m_angle : m_angle - h_angle; if(angle > 180.0) angle = 360.0 - angle;

printf(\ return 0; }

2.【日期】确定母亲节

成绩 折扣 10 开启时间 2014年10月28日 星期二 10:35 0.8 折扣时间 2014年11月12日 星期三 10:35 关闭时间 2014年11月19日 星期三 10:35 允许迟交 否 母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。 输入: 年份 输出:

日期(5月的哪一天)

测试输入 期待的输出 时间限制 内存限制64M 额外进程0 测试用例 1 以文本方式显示 以文本方式显示 1秒 1. 2014? 1. 11? 测试用例 2 以文本方式显示 以文本方式显示 1秒 1. 2015? 1. 10? 64M 0 测试用例 3 以文本方式显示 以文本方式显示 1秒 1. 2012? 1. 13? 64M 0 Code: #include int main() {

int year, n, week, total, day;

scanf(\

if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{ } else { }

week = (week + total) % 7; if (week == 0) week = 7; day = 7 - week + 8;

week = (year + year / 4 + year / 400 - year / 100) % 7; for(n = 0; n < 5; n++) { }

if(n == 0) total = 0;

if(n == 1 || n == 3) total += 31; if(n == 2) total += 28; if(n == 4) total += 30;

week = (year + year / 4 + year / 400 - year / 100 - 1) % 7; for(n = 0;n < 5; n++) { }

if(n == 0) total = 0;

if(n == 1 || n == 3) total += 31; if(n == 2) total += 29; if(n == 4) total += 30;

printf(\ return 0; }

3.【日期】计算星期

成绩 10 开启时间 2014年10月28日 星期二 10:40 折扣 0.8 折扣时间 2014年11月12日 星期三 10:40 关闭时间 2014年11月19日 星期三 10:40 允许迟交 否 给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。 输入: 年 月 日 输出:

0~6。

星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。 假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?

测试输入 期待的输出 时间限制测试用例 1 1. 2013 3 11? 1. 1? 以文本方式显示 以文本方式显示 1秒 内存限制64M 额外进程0 测试用例 2 以文本方式显示 1. 2013 13 15? 以文本方式显示 1. month is error.? 1秒 64M 0 测试用例 3 以文本方式显示 1. 2013 3 32? 以文本方式显示 1. day is error.? 1秒 64M 0 Code:

#include int main() {

int year, month, day, n, week, total; scanf(\ if(year <= 1900){

printf(\return 0;

}

if(month >= 13 || month < 1){ }

if(day < 0){ }

switch (month){

case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day > 31)

{printf(\ break; case 4: case 6: case 9: case 11: if(day > 30)

{printf(\ break;

case 2:if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {

if(day > 29) {printf(\ } else

printf(\return 0;

printf(\return 0;

{

if(day > 28) {printf(\ } break;

}

if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{ } else { }

week = (week + total + day - 1) % 7;

week = (year + year / 4 + year / 400 - year / 100) % 7; for(n = 0; n < month; n++) { }

if(n == 0) total = 0;

if(n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 ) total += 31; if(n == 2) total += 28;

if(n == 4 || n == 6 || n == 9 || n == 11) total += 30; week = (year + year / 4 + year / 400 - year / 100 - 1) % 7; for(n = 0;n < month; n++) { }

if(n == 0) total = 0;

if(n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 ) total += 31; if(n == 2) total += 29;

if(n == 4 || n == 6 || n == 9 || n == 11) total += 30;

printf(\ return 0; }

4.【中学】求最后3位数值(选做)

成绩 折扣 0 开启时间 2014年10月28日 星期二 10:45 0.8 折扣时间 2014年11月12日 星期三 10:45 关闭时间 2014年11月19日 星期三 10:45 允许迟交 否 小明在中学会求一个数的 n 次方了,但计算机还不会,请你来编写一个程序吧。由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。 输入:

a 和 n 的值。假设 a<=150 。 输出:

求 a 的 n 次方的最后 3 位数。

提示:再想一想,你的方法对吗?你用的是什么数据类型?

测试输入 期待的输出 时间限制 测试用例 1 1. 10 0? 1. The last 3 numbers is 1.? 以文本方式显示 以文本方式显示 1秒 内存限制 64M 0 额外进程 测试用例 2 以文本方式显示 1. 2 8? 以文本方式显示 1. The last 3 numbers is 256.? 1秒 64M 0 测试用例 3 以文本方式显示 1. 100 10? 以文本方式显示 1. The last 3 numbers is 000.? 1秒 64M 0 Code: #include int main() {

int a, n, i, total = 1; scanf(\ if(n == 0) total = 1; for(i = 1; i <= n; i++) { }

total = total % 1000;

printf(\ return 0; }

total *= a;

第五周作业

1.锻炼身体吧

成绩 折扣 10 开启时间 2014年11月4日 星期二 07:50 0.8 折扣时间 2014年11月19日 星期三 07:50 关闭时间 2014年11月26日 星期三 07:50 允许迟交 否 题目描述:

沫沫,灰灰和渣渣去锻炼身体,如果对他们跑步的距离分别只计整数 a、 b、 c,由于他们身高的差距,造成了 a<=b<=c,并且渣渣跑了N米之后就再也跑不动了。但是,按照他们事先的约定: 只有当 c*c==a*a+b*b 时,他们的锻炼才有效果。

现在他们三个人想知道,如果渣渣的极限N已知,那么有多少种有锻炼效果的跑步方案(即a, b, c有多少种可能的取值)。 输入:

一个整数N,表示渣渣的体力极限, N <= 5000。 输出:

一个整数,代表他们跑步方案的个数。

Hint:对于输入N=5,有方案 a=3, b=4, c=5, 共一种。

测试输入 期待的输出 时间限制 内存限制64M 额外进程0 测试用例 1 以文本方式显示 以文本方式显示 1秒 1. 5? 1. 1? 测试用例 2 以文本方式显示 以文本方式显示 1秒 1. 22? 1. 6? 64M 0 Code:

#include int main() {

int a = 1,b = 1,c = 1,maxnum,count = 0; scanf(\ for(c = 1;c <= maxnum;c++) {

for(a = 1; a < c; a++ ) {

for(b = 1; b < c; b++) { if((c*c == a*a +b*b)&&(a <= b)) count++; } } }

printf(\ return 0; }

2.寻找特殊偶数

成绩 折扣 10 开启时间 2014年11月4日 星期二 08:00 0.8 折扣时间 2014年11月19日 星期三 08:00 关闭时间 2014年11月26日 星期三 08:00 允许迟交 否 背景

有一种特殊偶数,它每一位上的数字都两两不相同。我们现在需要找出四位数中某一区间内的这类偶数。

输入

所要寻找的四位偶数的范围。每组输入有两个数字:第一个数字是最小范围;第二个数字是最大范围。如果输入遇到0,输入结束。

输出

列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。

测试输入

期待的输出

时间限制

试以文本方式显示 用例 1

1. 2. 3.

3000 3020? 6040 6090? 0 0?

4. 1. 2. 3.

3012 3014 3016 3018 ? counter=4?

6042 6048 6052 6054 6058 6072 6074 6078 6082 6084 ? counter=10?

以文本方式显示

1

64内存限制

0 额外进程

秒 M

测以文本方式显示 试用例 2

1. 2. 3.

9 101? 87 -1? 0 0?

以文本方式显示 1. 2.

Error? Error?

1640

秒 M

Code:

#include int main() {

int maxnum, minnum, n, g, s, b, q, count = 0; while(1){

scanf(\

if(minnum == 0 && maxnum == 0) return 0;

if((minnum > 999 && minnum < 10000) && (maxnum > 999 && maxnum < 10000) && (maxnum >= minnum)) { for(n = minnum; n <= maxnum; n++) { if(n % 2 == 0){ q = n / 1000;

b = n % 1000 / 100; s = n % 100 / 10; g = n % 10; if(q != b && q != s && q != g && b != s && b != g && s != g) { count++; printf(\ \ } } } printf(\ printf(\ count = 0; } else printf(\ } return 0; }

3.求最小 m 值

成绩 折扣 10 开启时间 2014年11月4日 星期二 08:05 0.8 折扣时间 2014年11月19日 星期三 08:05 关闭时间 2014年11月26日 星期三 08:05 允许迟交 否 求满足下列不等式的最小 m。 1 + 2 + 3 + 4 + ...... + m ≥ n

例如:n=100,当 m =14 时,满足:1+2+3+4+...+13=91<100,而 1 +2+3+4+......+14=105>100。 输入:n 输出:m

测试输入 期待的输出 时间限制 内存限制64M 额外进程0 测试用例 1 以文本方式显示 以文本方式显示 1秒 1. 100? 1. 14? Code:

#include

int main() {

int max, i = 0, sum = 0; scanf(\ while(sum < max) {

i++; sum += i; }

printf(\}

第六周作业

数字正方型

成绩 折扣 10 开启时间 2014年11月12日 星期三 05:55 0.8 折扣时间 2014年11月26日 星期三 05:55 关闭时间 2014年12月3日 星期三 05:55 允许迟交 否 这是双重循环的入门题目,大家来看看,你会做吗?

输入 n 的值,输出如下例( n=4 )所示的由数字组成的正方型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输入: n

输出:

数字组成的正方型

测试输入 期待的输出 时间限制 测试用例 1 以文本方式显示 1. 1? 以文本方式显示 1. 1? 1秒 64M 内存限制 0 额外进程 测试用以文本方式显以文本方式显示 1秒 64M 0

测试输入 期待的输出

时间限制

内存限制

额外进程

例 2 示

1.

1.

2?

2.

1 2? 3 4?

测试用例 3

以文本方式显示 1.

3?

以文本方式显示 1. 2. 3.

1 2 3? 4 5 6? 7 8 9?

1秒 64M 0

测试用例 4

以文本方式显示 1.

5?

以文本方式显示 1. 2. 3. 4. 5.

1 2 3 4 5? 6 7 8 9 10? 11 12 13 14 15? 16 17 18 19 20? 21 22 23 24 25?

1秒 64M 0

Code

#include int main() {

int n, x, y, count = 0; scanf(\ for(y = 0; y < n; y++) { for(x = 0; x < n; x++) { count++; printf(\ } printf(\ }

return 0; }

空心字符菱形

成绩 10 开启时间 2014年11月13日 星期四 06:10 折扣 0.8 折扣时间 2014年11月26日 星期三 06:10 关闭时间 2014年12月3日 星期三 06:10 允许迟交 否 输入: 菱型起始字母和菱形的高度。 输出:

参看测试用例,打印空心的由字符组成的菱形。

测试输入 期待的输出 时间限制 测试用例 1 1. 以文本方式显示 1. C 4? 2. 3. 4. 5. 6. 7. C? D D? E E? F F? E E? D D? C? 以文本方式显示 1秒 64M 内存限制 0 额外进程 测试用例 2 以文本方式显示 以文本方式显示 1. 1. B 2? 2. 3. B? C C? B? 1秒 64M 0 Code: #include int main() {

int n, i, q, p; char ch;

scanf(\ for(i = 0; i < n; i++) { for(q = i; q < n - 1; q++) printf(\ printf(\ for(q = 0; q < (2 * i - 1); q++)

{ printf(\ if(q == 2 * i - 2) printf(\ } printf(\ }

for(i = n - 2; i >= 0; i--) {

for(q = i; q < n - 1; q++) printf(\ printf(\ for(q = 2 * i - 1; q > 0; q--) { printf(\ if(q == 1) printf(\ } printf(\ } return 0; }

邮票组合

成绩 折扣 10 开启时间 2014年11月12日 星期三 06:20 0.8 折扣时间 2014年11月26日 星期三 06:20 关闭时间 2014年12月3日 星期三 06:20 允许迟交 否 背景: 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。

现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。

输入:

四种邮票的面值。

输出:

用这四种面值组成的邮资最大的从1开始的一个连续的区间。

说明:

如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。

名词解释:

邮资:就是你寄东西需要花多少钱。

邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。

如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。

测试输入 期待的输出 时间限制测试用例 1 1. 1 4 12 21? 1. The max is 71.? 以文本方式显示 以文本方式显示 1秒 内存限制64M 额外进程0 测试用例 2 以文本方式显示 1. 1 3 7 12? 以文本方式显示 1. The max is 46.? 1秒 64M 0 Code:

#include int main() { int i[5],t[3126],n,n1,n2,n3,n4,temp = 0; i[0] = 0; for(n = 1; n < 5; n++) scanf(\ for(n = 0; n < 3126; n++) t[n] = 0; for(n = 0; n < 5; n++) { for(n1 = 0; n1 < 5; n1++) { for(n2 = 0; n2 < 5; n2++) { for(n3 = 0; n3 < 5; n3++) { for(n4 = 0; n4 < 5; n4++) { t[temp] = i[n] + i[n1] + i[n2] + i[n3] + i[n4]; temp++; } }

}

} } }

for(n = 0; n < 3124; n++) { for(n1 = n; n1 < 3125; n1++) { if(t[n] > t[n1]) { temp = t[n]; t[n] = t[n1]; t[n1] = temp; } } }

temp = 0;

for(n = 0; n < 3125; n++) { if(t[n] < t[n + 1] ) temp++; if(temp != t[n + 1]) break; }

printf(\return 0;

程序讲解示例:整数排排序

成绩 折扣 0 开启时间 2014年10月19日 星期日 03:15 0.8 折扣时间 2014年12月31日 星期三 03:15 关闭时间 2014年12月31日 星期三 03:15 允许迟交 否 有一组整数,要将它们从小到大排序,去掉其中重复的数值。 输入:

第1行,输入整数N,表明接下来将有N(<=100)个整数读入。 第2~N行,输入N个这个数。

输出:排序后的整数(去掉重复的数值)

例如: 输入: 3(回车) 7 5 7(回车) 输出:5 7(回车)

测试输入

期待的输出

时间限制

测试用例 以文本方式显示 1

1. 2.

3? 7 5 5?

以文本方式显示 1.

5 7?

1秒

64M 内存限制

0 额外进程

测试用例 以文本方式显示 2

1. 2.

5? 1 0 0 2 2?

以文本方式显示 1.

0 1 2?

1秒 64M 0

Code:

#include int main() { int n, m, l, i[100], temp; scanf(\ for(m = 0; m < n; m++) scanf(\ for(m = 0; m < n - 1; m++) for(l = m + 1; l < n; l++) { if(i[m] > i[l]) { temp = i[m]; i[m] = i[l]; i[l] = temp; } } printf(\ temp = i[0]; for(m = 1; m < n; m++)

}

{ if(temp < i[m]) { printf(\ temp = i[m]; } }

printf(\

临时题

1.单词排序

成绩 折扣 10 开启时间 2014年11月27日 星期四 02:55 0.8 折扣时间 2014年12月10日 星期三 02:55 关闭时间 2014年12月17日 星期三 02:55 允许迟交 否 输入 5 个单词,将它们按从大到小的顺序排列后输出。 输入: 5个单词 输出:

排序后的顺序

测试输入 期待的输出 时间限制 测试用例 1 1. 2. 3. 4. 5. BASIC? C++? Pascal? C? Fortran? 1. 2. 3. 4. 5. Pascal? Fortran? C++? C? BASIC? 以文本方式显示 以文本方式显示 1秒 64M 内存限制 0 额外进程 测试用例 2 以文本方式显示 1. BASIC? 以文本方式显示 1. Pascal? 1秒 64M 0 测试输入 期待的输出 时间限制 内存限制 额外进程 2. 3. 4. 5. C++? C? Fortran? Pascal? 2. 3. 4. 5. Fortran? C++? C? BASIC? Code: #include #include int main() { char s[5][100], t[100]; int i, n; for(i = 0; i < 5; i++) scanf(\ for(i = 0; i < 4; i++) { for(n = i + 1; n < 5; n++) { if(strcmp(s[i],s[n]) < 0) { strcpy(t,s[i]); strcpy(s[i],s[n]); strcpy(s[n],t); } } } for(i = 0; i < 5; i++) printf(\ return 0; }

2.寻找矩阵的鞍点

成绩 折扣 10 开启时间 2014年11月27日 星期四 03:00 0.8 折扣时间 2014年12月10日 星期三 03:00 关闭时间 2014年12月17日 星期三 03:00 允许迟交 否 二维数组中的鞍点,即该位置上的元素是所在行上的最大值,是所在列上的最小值。 二维数组也可能没有鞍点。

输入一个二维数组的行数n,列数m,二维数组的诸元素值;输出数组的鞍点,以及鞍点所在的行列号。

输入:第一行为矩阵的行数和列数,从第二行开始,为矩阵本身(假设输入的矩阵只有0和1个鞍点) 3 4 1 3 5 3 2 3 4 1 3 2 6 7

输出:

Point: a[1][2] == 4 (下标从0开始)

测试输入

期待的输出

时间限制

测试用例 1

1. 2. 3. 4.

3 4? 1 3 5 3? 2 3 4 1? 3 2 6 7?

以文本方式显示

以文本方式显示 1.

Point:a[1][2]==4?

1秒

内存限制64M

额外进程0

测试用例 2

以文本方式显示 1. 2. 3. 4.

3 4? 1 2 3 4? 8 4 3 6? 9 4 5 1?

以文本方式显示 1.

No Point?

1秒 64M 0

Code:

#include #include int main() { int i[100][100], m, n, x, y, temp, log = 0; scanf(\ for(y = 0; y < m; y++) { for(x = 0; x < n; x++) { scanf(\ } }

}

//将每行的最大值放入每行的最后; for(y = 0; y < m; y++) { temp = 0; for(x = 0; x < n; x++) { if(i[y][x] > temp) temp = i[y][x]; } i[y][n] = temp; }

//将每列的最小值放入每列的最后 for(x = 0; x < n; x++) { temp = 0x7fffffff; for(y = 0; y < m; y++) { if(i[y][x] < temp) temp = i[y][x]; } i[m][x] = temp; }

for(y = 0; y < m; y++) { for(x = 0; x < n; x++) { if((i[y][x] == i[m][x]) && (i[y][x] == i[y][n])) {printf(\ } }

if(log == 0) printf(\return 0;

3.身份证的奥秘

成绩 折扣 10 开启时间 2014年11月27日 星期四 03:05 0.8 折扣时间 2014年12月10日 星期三 03:05 允许迟交 否 关闭时间 2014年12月17日 星期三 03:05 背景

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位置上的加权因子

Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模

Y = mod(S, 11) Y = S % 11 (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2

四、举例如下:

北京市朝阳区: 11010519491231002X 广东省汕头市: 440524188001010014 15位的身份证号升级办法:

15位的身份证号:dddddd yymmdd xx p 18位的身份证号:dddddd yyyymmdd xx p y

o 其中dddddd为地址码(省地县三级) o yyyymmdd yymmdd 为出生年月日 o xx顺号类编码 o p性别

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

输入

输入n组身份证号码,第一行为个数,以后每行为身份证号码。

输出

如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。

测试输入 期待的输出 时间限制 内存限制 64M 额外进程 0 测试用例 1 以文本方式显示 1. 2. 3. 4. 5. 4? 350622197904130331? 11010519491231002X? 110105491231002? 110105491231996? 以文本方式显示 1. 2. 3. 4. Invalid? Valid? 11010519491231002X? 110105184912319965? 1秒 Code:

#include #include int main() { int n, i, m, j, sumt, y; char s[100][19], temp[19], t; scanf(\ for(i = 0; i < n; i++) scanf(\ for(i = 0; i < n; i++) { m = 0; while(s[i][m] != '\\0') { m++; } if( m != 15 && m != 18) { printf(\ } if( m == 15) { for(j = 0; j < 6; j++) temp[j] = s[i][j]; if(s[i][12] == '9' && s[i][13] == '9' && s[i][14] > '5') { temp[6] = '1'; temp[7] = '8'; }

else { temp[6] = '1'; temp[7] = '9'; } for(j = 6; j < 16; j++) temp[j + 2] = s[i][j]; strcpy(s[i],temp); sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2; //sumt = atoi(s[i][0]) * 7 + atoi(s[i][1]) * 9 + atoi(s[i][2]) * 10 + atoi(s[i][3]) * 5 +atoi(s[i][4]) * 8 + atoi(s[i][5]) * 4 + atoi(s[i][6]) * 2 + atoi(s[i][7]) * 1 + atoi(s[i][8]) * 6 + atoi(s[i][9]) * 3 + atoi(s[i][10]) * 7 + atoi(s[i][11]) * 9 + atoi(s[i][12]) * 10 + atoi(s[i][13]) * 5 + atoi(s[i][14]) * 8 + atoi(s[i][15]) * 4 + atoi(s[i][16]) * 2; y = sumt % 11; switch (y) { case 0: s[i][17] = '1'; break; case 1: s[i][17] = '0'; break; case 2: s[i][17] = 'X'; break; case 3: s[i][17] = '9'; break; case 4: s[i][17] = '8'; break; case 5: s[i][17] = '7'; break; case 6: s[i][17] = '6'; break; case 7: s[i][17] = '5'; break; case 8: s[i][17] = '4'; break; case 9: s[i][17] = '3'; break; case 10: s[i][17] = '2'; break; } s[i][18] = '\\0'; printf(\ } if(m == 18) { sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2; y = sumt % 11; switch (y) { case 0: t = '1'; break; case 1: t = '0'; break;

}

case 2: t = 'X'; break; case 3: t = '9'; break; case 4: t = '8'; break; case 5: t = '7'; break; case 6: t = '6'; break; case 7: t = '5'; break; case 8: t = '4'; break; case 9: t = '3'; break; case 10: t = '2'; break; } if(t == s[i][17]) printf(\ else printf(\ } }

return 0;

4.安全的密码(选做)

成绩 折扣 0 开启时间 2014年11月27日 星期四 03:10 0.8 折扣时间 2014年12月10日 星期三 03:10 关闭时间 2014年12月17日 星期三 03:10 允许迟交 否 随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。

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

任务

林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。

应当按照以下的规则来判断密码是否安全: 1. 如果密码长度小于 6 位,则不安全

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

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

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

输入

输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。

输出

针对每一个密码判断并输出它是否安全。对于不安全的密码输出 \,对于中度安全的密码输出 \,对于安全的密码输出 \

输入样例

4 1234 abcdef ABC123 1#c3Gh

输出样例

Not Safe Not Safe Medium Safe Safe

测试输入 期待的输出 时间限制 内存限制 额外进程 测试输入 期待的输出 时间限制 内存限制 额外进程 0 测试用例 1 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 10? abcDEF? ABC? qw? `? ABCDEFGHIJKLMNOPQRST? 12345678901234567890? 1aB? 1 B? a X ? qwe123%^&ABC? 以文本方式显示 以文本方式显示 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Medium Safe? Not Safe? Not Safe? Not Safe? Not Safe? Not Safe? Safe? Not Safe? Safe? Safe? 1秒 64M Code:

#include #include int main() { int n, i, j, m, log1, log2, log3, log4; char s[100][21], t[10]; scanf(\ gets(t); for(i = 0; i < n; i++) gets(s[i]); for(i = 0; i < n; i++) { j = 0; while(s[i][j] != '\\0') { j++; } if(j < 6) {

printf(\ continue; } j = 0; log1 = 0; log2 = 0; log3 = 0; log4 = 0; while(s[i][j] != '\\0') { if(s[i][j] >= '0' && s[i][j] <= '9') log1 = 1; if(s[i][j] >= 'a' && s[i][j] <= 'z') log2 = 1; if(s[i][j] >= 'A' && s[i][j] <= 'Z') log3 = 1; if(!(s[i][j] >= '0' && s[i][j] <= '9') && !(s[i][j] >= 'a' && s[i][j] <= 'z') && !(s[i][j] >= 'A' && s[i][j] <= 'Z')) log4 =1; j++; } m = 0; if(log1 == 1) m++; if(log2 == 1) m++; if(log3 == 1) m++; if(log4 == 1) m++; if(m == 1) printf(\ if(m == 2) printf(\ if(m >= 3) printf(\ } return 0; }

期中考试测试题

1.组成最大数

成绩 折扣 10 开启时间 2014年11月20日 星期四 01:45 0.8 折扣时间 2014年12月4日 星期四 01:45 关闭时间 2014年12月11日 星期四 01:45 允许迟交 否 任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。 输入:自然数 n

输出:各位数字组成的最大数

测试输入 期待的输出 时间限制 内存限制 64M 额外进程 0 测试用例 1 以文本方式显示 以文本方式显示 1秒 1. 1593? 1. 9531? Code:

#include int main() { char s[50],t; int n = 0, i, m; scanf(\ while(s[n] != '\\0') { n++; } for(i = 0; i < n - 1; i++) { for(m = i + 1; m < n; m++) { if(s[i] < s[m]) { t = s[i]; s[i] = s[m]; s[m] = t; } } } printf(\}

2.回文数

成绩 折扣 10 开启时间 2014年11月20日 星期四 02:50 0.8 折扣时间 2014年12月4日 星期四 02:50 关闭时间 2014年12月11日 星期四 02:50 允许迟交 否 输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。 如: 1*1=1; 2*2=4;3*3=9;11*11=121

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

int n, m, square, i, temp, log; char s[6];

scanf(\

for(m = 1; m < n; m++) { i = 0; square = m * m; log = 1; while(square != 0) { temp = square % 10; s[i] = '0' + temp; i++; square /= 10; } for(temp = 0; temp < i / 2; temp++) { if(s[temp] != s[i - 1 - temp]) log = 0; } if(log) printf(\ } return 0;

}

3.洗牌

成绩 折扣 10 开启时间 2014年11月20日 星期四 03:00 0.8 折扣时间 2014年12月31日 星期三 23:55 关闭时间 2014年12月31日 星期三 23:55 允许迟交 否 假设我们有 2n 张牌,它们以 1, 2, ..., n, n+1, ..., 2n 编号并在开始时保持着这种顺序。一次洗牌就是将牌原来的次序变为 n+1, 1, n+2, 2, ..., 2n, n,也就是将原来的前 n 张牌放到位置 2, 4, ..., 2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1, 3, ..., 2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。但我们不知道对于一个特定的 n,需要几次洗牌才能将牌洗回原来的次序。

输入:

牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数 输出:

将牌洗回原来的次序所需要的洗牌次数

测试输入 期待的输出 时间限制 内存限制64M 额外进程0 测试用例 1 以文本方式显示 以文本方式显示 1秒 1. 10? 1. 6? 测试用例 2 以文本方式显示 以文本方式显示 1秒 1. 20? 1. 20? 64M 0 Code:

#include int main() {

int a[10000],tmp1[5000],tmp2[5000], i, m, n = 0, log = 0, total = 0; scanf(\ //

for(m = 0; m < 2* i; m++) a[m] = m; do{ for(m = 0; m < i; m++) {

tmp1[m] = a[m]; tmp2[m] = a[m + i]; } n = 0; for(m = 0; m < i; m++) { a[n] = tmp2[m]; n++; a[n] = tmp1[m]; n++; } log = 0; for(m = 0; m < 2 * i; m++) { if(a[m] != m) { log = 0; break; } if(a[m] == m) { log = 1; } } total++; }while(log != 1); printf(\ return 0; }