C语言 - 中国石油大学(华东)c语言上机题及答案大全- 副本

更新时间:2024-06-07 07:55:01 阅读量: 综合文库 文档下载

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

1.1 Hello world.

让我们用C语言向世界问好。 最早的程序基本是这个样子的: 程序一:

#include void main() {

printf(\}

程序二:

#include int main() {

printf(\ return 0; }

上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。 输入:无

输出:Hello world. #include int main() {

printf(\}

1.2 Welcome to Beijing.

让我们来练习如何显示多行文字。 输入:无

输出:就是下面的那段文字。 #include void main()

{printf(\printf(\

printf(\}

1.3 练习最简单的printf和scanf

printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。 输入:整型变量x的值。

输出:输出整型变量x对应的十进制、八进制和十六进制形式。

认真观察-1的八进制和十六进制输出,请想想是为什么。

#include int main() {int x;

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

1.4 练习两个整数之间的运算 背景:基本练习。

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

输出:分别输出进行+、-、*、/、*之后的运行结果。 #include int main() {int x,y;

scanf(\

printf(\ printf(\ printf(\ printf(\ printf(\ return 0; }

1.5 学习打印你的第一个图形

背景:我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。 程序如下:

#include int main() {

printf(\ printf(\ printf(\ printf(\ return 0; }

要求:按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。 输入:无。

输出:指定图形。 #include

- 1 -

int main() {

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

2.1 整型数的表示范围

编写一个循环程序,输入 N 值,输出 N 的阶乘。关于循环程序怎么编写,可以参考教材第3章P66页的例题4.2和第5章P82的例题5.1的内容。注意整型数的表示范围,如果当输入的 N 比较大时,例如 N 等于 20 时,输出怎么是负数了?自己想明白吧!

#include void main() {int N,i; int sum=1; N>=2;

scanf(\if(N<=16)

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

printf(\}

if(N>=17)

printf(\}

2.2 求正弦函数值

已知求正弦 sin(x) 的近似值的多项式公式为: sin(x) = x - x3/3! + x5/5! - x7/7!+ …… + (-1)n x2n+1/(2n+1)! + …

编写程序,要求输入 x (单位是弧度)和ε,按上述公式计算 sin(x) 的近似值,要求计算的误差小于给定的ε。

此题当然要用到循环语句,到第5章去找个猫来照着画吧,循环的终止条件就是本次计算出来的正弦函数值和上次计算的值的差小于给定的ε。求两个值的差时,要求出其绝对值,使用库函数fabs(),头文件在math.h里。

友情提示:给定的误差值ε越小,计算的精度越高,但是要注意喽,给的精度太高,你的程序会成为死循环。如果出现死循环的情况,可以用

+键退出程序。 #include #include int main()

{ float x,eps,s,y=0,y0,t; int n,j;

scanf(\ n=t=j=1; s=x; do { y0=y;

if (n%2==0) y=y-s/t; else y=y+s/t; s*=x*x;

t*=(j+1)*(j+2); j+=2; n++;

} while(fabs(y0-y)>eps); printf(\system(\ return 0; }

2.3 判断输入的字符的类型

我们将字符分为五类:大写字母、小写字母、数字、控制字符、其他字符。

编写程序,从键盘输入一个字符,输出字符所属的类型:大写字母时输出capital letters, 小写字母时输出small letters,数字是输出figures,其他字符时输出 others。 #include void main() {

char c;

c = getchar ( ); if (c < 0x20)

printf (\character is a control character\\n\

else if (c >= '0' && c <= '9')

printf (\ else if (c >= 'A' && c <= 'Z')

printf (\ else if (c >= 'a' && c <= 'z')

printf (\ else

- 2 -

printf (\}

3.1 找零钱

假定有 5 角、 1 角、 5 分、 2 分和 1 分共 5 种硬币,在 给顾客找硬币时,一般都会尽可能地选用硬币个数最小的方法。 例如,当要给某顾客找 7 角 2 分钱时,会给他一个 5 角, 2 个 1 角 和 1 个 2 分的硬币。试编写一个程序,输入的是要找给顾客的零 钱(以分为单位),输出的是应该找回的各种硬币数目,并保 证找回的硬币数最少。

#include int main() {

int x1,x2,x3,x4,x5; int x;

scanf(\ x1=x/50; x2=xP/10; x3=xP/5; x4=xP%5/2; x5=xP%5%2/1; printf(\ printf(\ printf(\ printf(\ printf(\ return 0; }

3.2 计算时钟的夹角 背景:钟面上的时针和分针之间的夹角总是在 0 度~ 359 度之间。举例来说,在十二点的时候两针之间的夹角为 0 度,而在六点的时候夹角为 180 度,在三点的时候为 90 度。本题要解决的是计算 0:00 到 12:00之间任意一个时间的夹角。

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

输出: 对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。 友情提示:以表中心到12点的连线为基准,分针每走1分钟是6度,时针与基准的夹角每个小时也是30度,从整点开始,每过1分钟时针再增加0.5度。

提示:时钟夹角计算公式|5.5m-30h|,h为时针,m

为分针。求浮点型绝对值的函数为fabs,需要包含math.h头文件 #include \#include \int main() { int h,m; double angle; scanf(\ angle=fabs(5.5*m-30*h); if(angle>180) angle=360-angle; printf(\%d:d the angle is %.1f degrees.\\n\}

3.3 照猫画猫:计算圆柱的侧面积及体积

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

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

输出 s=< 圆柱的侧面积 >,v=< 圆柱的体积 > 要求 1. 所有变量都定义为双精度类型 2. 结果精确到小数点后两位 #include \ #define n 3.1415926 int main() {

float r,h,s,v; printf;

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

printf(\ }

3.4 分离整数

任意从键盘上输入一个三位正整数,要求正确地分离出它的个位、十位和百位,并分别在屏幕上输出。

比如输入的三位正整数 #include \int main() {

- 3 -

int x,hundreds,tens,units; printf; scanf(\ hundreds=x/100; tens=x0/10; units=x0; printf(\s,tens,hundreds); }

3.5 鸡兔同笼

已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只?

输入:头和脚的数目

输出:兔子和鸡的数目(输出语句为:printf(\) Sample

输入:10 20

输出:rabbit=0,chicken=10 #include \int main() { int chicken,rabbit,f,h; scanf(\ rabbit=(f-2*h)/2; chicken=(4*h-f)/2; printf(\); }

4.1 温度转换

背景: 经常出国旅行的驴友都知道,需要时时了解当地的气温状况,但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(F),有些使用摄氏温度(C)。现在,请你根据温度转换公式设计一个温度转换程序,可以进行温度转换。如果输入摄氏温度,显示转换的华氏温度;如果输入华氏温度,显示转换的摄氏温度。 温度转换的公式为:F=(C×9/5)+32 ;C=(F-32)×5/9 ;式中F--华氏温度,C--摄氏温度。

输入: 第一个数据(1 或 2 )确定转换的类型:华氏转摄氏(1);摄氏转华氏(2); 第二个数据是相应需要转换的温度值。

输出: 相应的转换后的温度值(保留小数点后 2 位)。

#include

void main() { int lx; double f,c;

scanf(\ if(lx==1){

scanf(\ c=(f-32)*5/9;

printf(\ } else{

scanf(\ f=(c*9/5)+32;

printf(\ } }

4.2 分段函数

有一分段函数,y=f(x)。当x小于6时,y=x-12;当x大于等于6且小于15时,y=3x-1;当x大于等于15时,y=5x+9.从键盘上输入一个整数x,输出对应的y值。

#include void main() { int x,y; scanf(\ if(x<6) y=x-12; else if(x<15) y=3*x-1; else y=5*x+9; printf(\ return 0; }

4.3 整数位数判断

输入一个不多于5位的正整数,要求: (1)求它是几位数;(2)逆序打印出各位数字。 #include #include #define SIZE 5 int

main(void) {

- 4 -

int bit_count;//位数

long int input_num;//输入数

int result[SIZE];//存放各个位的数

int i; scanf(\

if (input_num < 0 || input_num > 99999) { printf(\ exit(1); }

for( bit_count = 0; input_num; ++bit_count) {

result[bit_count] = input_num % 10;

input_num /= 10; }

printf(\ for(i = 0; i < bit_count; ++i) printf(\ printf(\ exit(0); }

4.4 四位数拆分

输入一个四位数,判断千位、百位、十位和个位数字之和是否为偶数,如果是,输出Yes,如果不是,输出No;如果不是四位数,输出Invalid data。 #include void main() {

int x,a,b,c,d,e; scanf(\

if(x/1000<1||x/10000>=1) printf(\ else { a=x/1000;

b=x00/100; c=x000/10; d=x000; e=(a+b+c+d)%2; if(e==0) printf(\ else

printf(\ } }

4.5 磨磨你的砍柴刀:判断三角形的形状

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

输入:三角型的3条边的长度(int型)。 输出:等边三角形:equilateral triangle. 等腰三角形:isoceles triangle. 不构成三角形:non-triangle. 一般三角形:triangle. #include void main() {

float a,b,c;

scanf(\ if(a+b4.6 字符加密输出

从键盘上输入一个字符,进行加密以后再输出在屏幕上。加密规律是:输入小写英文字母时,输入a 输出Z、输入b输出Y、输入c输出X、...、输入z输出A。输入大写英文字母时,将该字母ASCII码值再加上该值的1/2后输出所对应的字符,例如数字A的ASCII码值是65,加上其值的1/2后是98(小数四舍五入),则输出字符‘b’。输入数字时,将该数字原ASCII码值再加上该值十进制的十位上的数后输出,例如数字9的ASCII码值是57,加上十位上的数5后是62,则输出字符‘>’。输入其他字符时原样输出。 友情提示:整数之间运算的结果要取整,例如5/2的结果是2,而5.0/2.0对小数四舍五入的结果就是3.0了。所以输入大写英文字母时的输出要仔细考虑。

#include int main() { char ch; int a;

- 5 -

ch=getchar();

if(ch>=97&&ch<=122)

{ch=187-ch;putchar(ch);} else if(ch>=65&&ch<=90) {a=ch%2;

if (a==1) (char)a=(ch+1)/2+ch; else (char)a=ch/2+ch; putchar(a);}

else if(ch>=48&&ch<=57) {ch=ch/10+ch; putchar(ch);} else putchar(ch); printf(\ }

4.7 判断某年某月的天数

一年有365天,有的月份有31天,有的有30天,2月份闰年的时候是29天,非闰年的时候是28天。现在要求从键盘上输入一个年份和月份,输出其对应的天数。

#include main()

{ int year,month,days;

scanf(\ switch(month) { case 1: case 3: case 5: case 7: case 8: case 10:

case 12: days=31;break; case 4: case 6: case 9:

case 11:days=30;break;

case 2:if((year % 4 ==0) && (year % 100 !=0) ||(year % 400==0)) days=29; else days=28; }

printf(\}

4.8 花多少钱买衣服

周末商场促销呢,某品牌服装既可以买套装,也可

以买单件。若买的不少于50套,每套80元;不足50套的每套90元,只买上衣每件60元,只买裤子每条45元。编写程序,输入计划购买的上衣数量 a 和裤子的数量 b ,计算并输出应该付的款 m 。

#include void main() {

int a,b,y;

scanf(\ if(b<=a&&b<50) y=90*b+(a-b)*60; if(b<=a&&b>=50) y=80*b+(a-b)*60; if(a=50) y=80*a+(b-a)*45; printf(\}

4.9 到邮局去寄包裹

你去邮局给朋友寄礼物。发现邮局对邮寄包裹的费用是这样规定的:如果包裹长宽高任意一个尺寸超过1米,或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收手续费 0.2 元,不同重量的邮资按下表计算: 重量(千克) 收费标准(元) 小于10 0 . 80

大于等于10但不超过20 0 . 75

大于等于20但不超过30 0 . 70

编写程序,输入包裹的长、宽、高尺寸和重量,输出所需的邮资(输出结果中包含两位小数即可),超出尺寸或重量的输出 \” . #include void main() {

float a,b,c,m,y;

scanf(\ if(a>1||b>1||c>1||m>30) printf(\ else {

- 6 -

if(m<10) y=0.80*m+0.2; else if(m<20) y=0.75*m+0.2; else y=0.70*m+0.2; printf(\ } }

4.10 输出星期几的英文表示

输入用数字(1--7)表示的星期几,输出星期几的英文表示,输入的数字有误,输出单词\回车)\。 #include void main() {

int a;

scanf(\ switch((int)(a)) {

case 1:printf(\ case 2:printf(\ case 3:printf(\ case 4:printf(\ case 5:printf(\ case 6:printf(\ case 7:printf(\ default:printf(\ } }

5.1 输出一行星号

编写程序在一行中输出 N 个星号。 输入: N值

输出: 一行中N个星号 #include int main() {

int n,i;

scanf(\

for(i=0;i

5.2 打印平行四边形

输入图形的高 n 和首字符 c ,输出如下例( n=5 ,c='A' )所示的图形 . ABCDE BCDEF CDEFG DEFGH EFGHI

输入:整数n例如 5 和某个字符例如 A 输出:高为5和首字符A 的平行四边形 #include void main() { int n,m,i,d; char p,t;

scanf(\ for(m=0;m

for(i=0;i

printf(\ }

for(d=0;d

t=p+d+m; printf(\ } for(i=0;i

printf(\ }

printf(\ } }

5.3 空心的倒三角型

背景:请根据要求打印可空心倒三角形。 输入: 输入三角形的高度(h >0)。

输出:打印相应的空心倒三角形。图样参见测试用例。

#include #include int main() {int h,i,j,k,m,n; scanf(\ if((h>1)&&(h%2!=0)) {

- 7 -

for(i=1; i<=(2*h-1); i++) { printf(\ } printf(\ for(j=1; j<=(h-2); j++) { for(k=1; k<=j; k++) { printf(\ } printf(\ for(m=1; m<=(2*h-3-2*j); m++) { printf(\ } printf(\ printf(\ } for(n=1;n<=(h-1);n++) { printf(\ } printf(\ } else printf(\ return 0; }

选做 5.4 打印实心正方形

5.1题中你已经打印了一行*号,这次在屏幕上输出一个由星号组成的 n 行 n 列的正方形。

程序输入 n 值,输出如下例( n=4 )所示的高和上底均为 n 的正方形: **** **** **** ****

#include #include int main() {

int a=1,n,b; scanf(\

while(a<=n) {

b=1; do {

printf(\ b++; }

while(b<=n); printf(\ a++; }

return 0; }

选做 5.5 空心字符菱形

输入:菱型起始字母和菱形的高度。

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

#include #include int main() {

char ch;

int n,a=1,b,c;

scanf(\ while(a<=n) {

b=1;

while(b<=n-a) {

printf(\ b++; }

printf(\ c=1; if(a>=2) {

while(c<=2*a-3) {

printf(\ c++; }

printf(\ }

- 8 -

ch=ch+1; printf(\ a++; }

a=1; ch=ch-2; while(a<=n-1) {

b=1;

while(b<=a) {

printf(\ b++; }

printf(\ c=1;

if(a<=n-2) {

while(c<=2*n-2*a-3) {

printf(\ c++; }

printf(\ }

ch=ch-1; printf(\ a++; }

return 0; }

选做 5.6 输出一个字母K吧!

输入一个整数n,输出图形K。如n=4时,输出如下图形。 * * * * * * * * * * * * *

#include #include int main() {

int n,i=1,j;

scanf(\ while(i<=n-1) {

j=1;

printf(\ while(j<=n-i) {

printf(\ j++; }

printf(\ i++; }

printf(\ i=1;

while(i<=n-1) {

j=1;

printf(\ while(j<=i) {

printf(\ j++; }

printf(\ i++; }

return 0; }

选做 5.7 输出X图形

输入 n 值,输出下例( n=3 )所示的图形: * * * * * * * * *

输入:整数n(例如3) 输出:如上图所示X 形图形 #include #include int main() {

int n,i=1,j,k;

- 9 -

scanf(\ while(i<=n-1) {

j=1;

while(j<=i-1) {

printf(\ j++; }

printf(\ k=1;

while(k<=2*n-2*i-1) {

printf(\ k++; }

printf(\ j=1;

while(j<=i-1) {

printf(\ j++; }

printf(\ i++; } i=1;

while(i<=n-1) {

printf(\ i++; }

printf(\ i=1;

while(i<=n-1) {

printf(\ i++; }

printf(\ i=1;

while(i<=n-1) {

j=1;

while(j<=n-i-1) {

printf(\ j++; }

printf(\ k=1;

while(k<=2*i-1) {

printf(\ k++; }

printf(\ j=1;

while(j<=n-i-1) {

printf(\ j++; }

printf(\ i++; }

return 0; }

选做 5.8 输出图形 编程,输入 n 值,输出下例( n=5 )所示的高为 n 的图形 :

#include #include int main() {

int n,i=1,j,k,l; scanf(\ while(i<=n-1) {

j=1;

while(j<=i) {

printf(\ j++; } k=1;

while(k<=2*n-2*i-1) {

- 10 -

printf(\ k++; } l=1;

while(l<=i) {

printf(\ l++; }

printf(\ i++; } i=1;

while(i<=2*n-1) {

printf(\ i++; }

printf(\ return 0; }

选做 5.9 画个空心的梯形吧

编程,输入 n ,输出如下例( n=5 )所示的 高和上底均为 n 的等腰空心梯形。 #include #include

int main() {

int n,i=1,j,k; scanf(\ while(i<=n) {

j=1;

while(j<=n-i) {

printf(\ j++; }

printf(\ if(i==1) {

for(k=1; k<=n-2; k++) printf(\

}

else if(i==n) {

for(k=1; k<=3*n-4; k++) printf(\ } else {

for(k=1; k<=n+2*i-4; k++) printf(\ }

printf(\ j=1;

while(j<=n-i) {

printf(\ j++; }

printf(\ i++; }

return 0; }

选做 5.10 输出菱形图案

输入 n ,输出如下例( n=3 )所示的菱形: * *** ***** *** *

#include #include int main() {

int n,i,j,k;

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

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

printf(\ }

for(k=1; k<=2*i-1; k++) {

- 11 -

printf(\ }

printf(\ }

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

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

printf(\ }

for(k=1; k<=2*n-2*i-1; k++) {

printf(\ }

printf(\ }

return 0; }

5.11 最大公约数

输入两个正整数m和n,求它们的最大公约数和最小公倍数

比如,输入m和n的值分别为14和21,则最大公约数为7,最小公倍数为42。 #include void main() {

int m,n,i,j;

scanf(\ for(i=m;i>=1;i--) {

if (n%i==0&&m%i==0)

{printf(\greatest common divisor is %d\\n\ } }

for (j=m;;j++) {

if (j%m==0&&j%n==0)

{printf(\least common multiple is %d\\n\ } } }

5.12 水仙花数

输出所有的水仙花数。所谓的水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33 输出语句:printf(\#include void main() { int n, i, j, k; for(n=100; n<=999; n=n+1) { }

i = n/100; // 取出n的百位数 j = (n/10); // 取数n的十位数 k = n; // 取出n的个位数 if(n==i*i*i+j*j*j+k*k*k) printf(\}

5.13 完数

一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,且6=1+2+3,因此6是完数,从键盘上输入一个正整数,判断其是否为完数。如果是,则按照如下格式输出。比如,输入6,则输出Yes,its factors are 1 2 3;如果输入8,则输出No

#include #include int main() {

int n,i,c,sum=0; scanf(\ for(i=1;i

if(n%i==0) sum=sum+i; }

if(n==sum) {

printf(\ for(c=1; c

printf(\

- 12 -

} else printf(\ }

5.14 素数

输入两个正整数m和n,求出[m,n]区间的所有素数 #include #include void main() {int m,n,i,j,k;

scanf(\ for(i=m;i

for(j=2;j<=k;j++) if(i%j==0) break; if(j>k) printf(\ }

printf(\}

5.15 找出最大素数

素数是指一个只能被1和它本身整除的数,在数论中占有重要的研究地位,在当代密码学中也被广泛应用。

输入:取值范围

输出:该范围内的最大素数 #include int main() {

int a,i,j;

scanf(\ for(i=a;i>1;i--) {

for(j=2;j

if(i%j==0) break; } if(j==i) { printf(\ break;

}

} }

5.16 回文数 输入一个数,判断是否为回文数,如果是,输出Yes,否则输出No

#include #include #include char *chan(int count) ;

int main(int argc, char* argv[]) {

char *str; int i,n;

str=chan(0); n=strlen(str);

for (i = 0; i<(n-1)/2; i++) { if (str[i]!=str[n-1-i]) { n=0; break; } }

if (n) {

printf(\ }

else printf(\ free(str);

system(\ return 0; }

char *chan(int count) {

char a;

static char * p;

if ((a=getchar())!='\\n') {

count++; chan(count); } else {

p=malloc(sizeof(char)*(count+1)); *(p+count)=0; return p;

- 13 -

}

*(p+count-1)=a; return p; }

选做 5.17 自守数

自守数是指一个数的平方的尾数等于该数自身的自然数。例如252=625,762=5776。输入一个自然数,判断其是否为自守数。 如果是,则输出Yes,否则输出No

#include #include int main() {

int n,i,j,a=0,b=1,c; scanf(\ i=n*n; j=i-n;

while(n>0) {

n=n/10; a++; }

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

b=b*10; }

if(j%b==0) {

printf(\ } else {

printf(\ }

return 0; }

选做 5.18 求亲密数

若正整数A的全部约数(包括1,不包括A本身)之和等于B ; 且整数B的全部约数(包括1,不包括B本身)之和等于A,则 A 、 B 为亲密数。编程,输入正整数A,输出亲密数 A , B(A<=B) ,若不存在亲密数,则输出 No output 。

例如:220和284就是一对亲密数。220的约数是:

1、2、4、5、10、11、20、22、44、55、110,约数之和是284;284的约数是:1、2、4、71、142,约数之和是220。 #include #include int main() {

int n,a,b=0,c=0; scanf(\ for(a=1; a

if(n%a==0) {

b=a+b; } }

for(a=1; a

if(b%a==0) {

c=c+a; } }

if(n==c) {

printf(\ } else {

printf(\ }

return 0; }

选做 5.19 高次方的尾数

输入2个正整数m和n,求mn后三位数。比如输入m和n的值分别为13和13,则1313的后三位数字为253。 #include #include int main() {

int m,n,a,b=1,c;

scanf(\ for(a=1; a<=n; a++)

- 14 -

{

b=b*m; b=b00; }

printf(\last 3 digits of %d ** %d is: %d\\n\ return 0; }

选做 5.20 阶乘尾数零的个数

输入一个正整数n,求其阶乘尾数0的个数。比如,输入n的值为100,则其阶乘尾数0的个数为24。 #include #include int main() {

int n,a,b,c;

scanf(\ a=n/25; b=n/5; c=a+b;

printf(\number of 0 in the end of %d! is:%d.\\n\ return 0; }

5.21 看看是谁做的好事

某四位同学中有一个做了好事 , 不留名 , 表扬信来了,校长问是谁做的好事 . 以下四个人中有三个人说的是真话. A 说 : 不是我 B 说 : 是 C C 说 : 是 D

D 说 : 他说的不对 !

编写程序:输出是谁做的好事,只输出对应的大写字母,输出格式printf(\ 。 #include #include int main() {

char ch;

for(ch='A'; ch<='D'; ch++) {

if(ch=='A'&&ch=='C'&&ch=='D'&&ch!='D') printf(\

if(ch!='A'&&ch!='C'&&ch=='D'&&ch!='D')

printf(\

if(ch!='A'&&ch=='C'&&ch!='D'&&ch!='D') printf(\

if(ch!='A'&&ch=='C'&&ch=='D'&&ch=='D') printf(\ } }

5.22 贪吃的猴子

有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。 输入:天数n

输出:第一天的桃子个数,输出语句为printf(\monkey got %d peachs in first day.\\n\ Smaple: Input: 5

Output

The monkey got 114 peachs in first day. #include #include int main() {

int n,i;

long int m=1; scanf(\ for(i=1; i<=n-1; i++) {

m=(n-i+m)*2; }

printf(\monkey got %d peachs in first day.\\n\ return 0; }

5.23 百马百担

有100匹马,驮100担货,其中大马驮3担,中马驮2担,两匹小马驮1担 输入:无

输出:大、中、小马的个数,用逗号分隔。例如:2,30,68

- 15 -

说明:大、中、小马都必须有,结果中要列出所有的组合可能每个结果占一行因为有多个结果,结果的排序按照大马的个数从少到多 #include void main() {int x,y,z;

for(x=1;x<33;x++) for(y=1;y<50;y++) {z=(100-3*x-2*y)*2; if(x+y+z==100) printf(\ } }

5.24 四大湖问题

我国有4大淡水湖。

A说:洞庭湖最大,洪泽最小。鄱阳湖第三。 B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二。太湖第三。

C说:洪泽湖最小,洞庭湖第三。

D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。

4个人每人仅答对了一个,请你编程给出4个湖从大到小的顺序。 #include #include int main() {

int a,b,c,d;

for(a=1; a<=4; a++)

for(b=1; b<=4; b++) {

if(b==a) continue; for(c=1; c<=4; c++) {

if(c==a||c==b) continue; for(d=1; d<=4; d++) {

if(d==a||d==b||d==c) continue;

if((b==1||d==4||a==3)==1&&(d==1||b==4||a==2||c==3)==1&&(d==4||b==3)==1&&(a==1||c==4||d==2||b==3)==1)

{

if(a==1) printf(\鄱阳湖\\n\

if(a==2) printf(\鄱阳湖\\n\

if(a==3) printf(\鄱阳湖\\n\

if(a==4) printf(\鄱阳湖\\n\

if(b==1) printf(\洞庭湖\\n\

if(b==2) printf(\洞庭湖\\n\

if(b==3) printf(\洞庭湖\\n\

if(b==4) printf(\洞庭湖\\n\

if(c==1) printf(\太湖\\n\

if(c==2) printf(\太湖\\n\

if(c==3) printf(\太湖\\n\

if(c==4) printf(\太湖\\n\

if(d==1) printf(\洪泽湖\\n\

if(d==2) printf(\洪泽湖\\n\

if(d==3) printf(\洪泽湖\\n\

if(d==4) printf(\洪泽湖\\n\

break; } }

break; }

break; } return 0; }

选做 5.25 黑色星期五 在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,

- 16 -

不管哪个月的13日又恰逢星期五就叫 “ 黑色星期五 ” 。输入某年年号和该年的元旦是星期几( 1-7),输出该年所有的 “ 黑色星期五 ” 的日期(年 /月/日) 。

输入: 4位年号和该年元旦是星期几

输出: 所有的 “黑色星期五”的日期(年/月/日) #include #include int main() {

int y,m,d,x;

scanf(\ for(m=1; m<=12; m++) {

if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)

{

for(d=1; d<=31; d++) {

if(d==13&&x==5)

printf(\ x++; if(x==8) x=1; } }

if(m==4||m==6||m==9||m==11) {

for(d=1; d<=30; d++) {

if(d==13&&x==5)

printf(\ x++; if(x==8) x=1; } }

if(((y%4==0&&y0!=0)||y@0==0)&&m==2) {

for(d=1; d<=29; d++)

{

if(d==13&&x==5)

printf(\ x++; if(x==8) x=1; } }

if(y%4!=0&&m==2) {

for(d=1; d<=28; d++) {

if(d==13&&x==5)

printf(\ x++; if(x==8) x=1; } } }

return 0; }

选做 5.26 抓疑犯

某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:

(1) A 、 B 至少有一人作案;

(2)A 、 E 、 F 三人中至少有两人参与作案; (3)A 、 D 不可能是同案犯;

(4)B 、 C 或同时作案,或与本案无关; (5) C 、 D 中有且仅有一人作案;

(6)如果 D 没有参与作案,则 E 也不可能参与作案。

试编一程序,将作案人找出来。 输出格式为(以下结果不是最终答案): A:不是罪犯 B:是罪犯 C:是罪犯 D:不是罪犯 E:不是罪犯 F:是罪犯

#include #include

- 17 -

int main() {

int A,B,C,D,E,F; for(A=0; A<=1; A++) for(B=0; B<=1; B++) for(C=0; C<=1; C++)

for(D=0; D<=1; D++) for(E=0; E<=1; E++) for(F=0; F<=1; F++)

if(A+B>=1&&A+E+F>=2&&A+D==1&&(B+C==0||B+C==2)&&C+D==1&&(D+E==0||D+E==2)) {

if(A==1)

printf(\是罪犯\\n\

if(A==0)

printf(\不是罪犯\\n\

if(B==1)

printf(\是罪犯\\n\

if(B==0)

printf(\不是罪犯\\n\

if(C==1)

printf(\是罪犯\\n\

if(C==0)

printf(\不是罪犯\\n\

if(D==1)

printf(\是罪犯\\n\

if(D==0)

printf(\不是罪犯\\n\

if(E==1)

printf(\是罪犯\\n\

if(E==0)

printf(\不是罪犯\\n\

if(F==1)

printf(\

是罪犯\\n\

if(F==0)

printf(\不是罪犯\\n\

} return 0; }

选做 5.27 零钱换整钱

小明去银行存钱,拿了一堆硬币。已知 1 角的硬币厚度为 1.8mm , 5 角的硬币厚 1.5mm , 1 元的硬币为 2.0mm 。小明将 1 角的硬币放成一摞,将 5 角的硬币硬币放成一摞,将 1 元的硬币放成一摞,发现 3 摞硬币一样高。银行正好把这些硬币换成若干张面值为 10 元的纸币。问小明至少带了多少钱的硬币(元为单位),每种面值的硬币有多少个?

输入: 无 输出: 1 角的数量,5 角的数量,1元的数量,总金额。(例如:20,30,40,50)

说明: 在结果中只输出各个对应的数字即可 #include #include int main() {

int a,b,c,d;

for(a=1; a<=100; a++)

for(b=1; b<=100; b++) for(c=1; c<=100; c++)

if(20*a==15*b&&20*a==18*c) {

d=(a*10+b*5+c)0; if(d!=0) break;

d=(a*10+b*5+c)/10;

printf(\ } return 0; }

选做 5.28 马戏团观众人数 一个马戏团表演, n 个座位全满,全部门票收入是 120 元,现在知道,男人每人 5 元,女人每人 2 元,小孩每人 1 角。编程,输入总人数 n ,输出满足要求的男人、女人和小孩人数的全部方案。若 n 人

- 18 -

无法满足条件,则输出“No output\\n”。 输入: 人数 n

输出: 男人、女人和小孩人数 #include #include int main() {

int n,a,b,c;

scanf(\ for(a=0; a<=24; a++)

for(b=0; b<=(120-5*a)/2; b++)

for(c=0; c<=(120-5*a-2*b)*10; c++)

if(5*a+2*b+c/10==120&&a+b+c==n)

printf(\ return 0; }

选做 5.29 爱因斯坦的数学题

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩一阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶?

输出语句格式为:printf(\number = %d\\n\ #include #include int main() {

int number;

for(number=1; number<=1000; number++)

if(number%2==1&&number%3==2&&number%5==4&&number%7==0) {

printf(\number = %d\\n\ break; } return 0; }

选做 5.30 抓交通肇事犯

一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件, 但都没有记住车号,只记下车号的一些

特征。甲说:牌照的前 两位数字是相同的;乙说:牌照的后两位数字是相同的,但与 前两位不同;丙是位数学家,他说:四位的车号刚好是一个整 数的平方,请根据以上线索求出车号。 #include #include int main() {

int a,b,c,n;

for(a=0; a<=9; a++)

for(b=0; b<=9; b++) if(a!=b) {

n=1100*a+11*b;

for(c=30; c<1000; c++) if(n==c*c)

printf(\is:%d\\n\ } return 0; }

5.31 求和

输入整数 m 和正整数 n ,按下列公式计算 s : s=m-(m+1)+m+2-(m+3)+ ?? +(-1)n(m+n) 。 输入: m 和 n 输出: s

#include int main() {

int i,sign=1,m,n,s=0,t; scanf(\ for (i=0;i<=n;i++) { t=sign*(m+i); sign=-sign; s=s+t; }

printf(\ }

5.32 计算SUM的值

已知公式:SUM = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n 输入:n

输出:表达式 sum 的值。结果保留 6 位小数

- 19 -

#include int main() {

int i,n;

float s = 0.0, t; scanf(\ for (i=1;i<=n;i++) { t=1.0/i; s+=t; }

printf(\ return 0; }

5.33 迭代法

用迭代法求.求平方根的迭代公式为:

要求前后两次求出的x的差的绝对值小于10-5。 #include #include int main() {

double x1,x2,a; scanf(\ {

x2=1.0; do {

x1=x2;

x2=0.5*(x1+a/x1); }

while(fabs(x2-x1)>=1e-5);

printf(\ }

return 0; }

5.34 分数序列

有一个分数序列:...............,输入整数n,求出其前n项的和。

输出语句格式为:printf(\#include int main() {

int a,b,c,n,i; double s;

}

scanf(\a=2,b=1,s=0; for (i=1;i<=n;i ++) { s+=(1.0*a/b); c=b; b=a; a=a+c; }

printf(\return 0;

5.35 求e的值

编写程序,从键盘输入整数 n , 求 e 的值 . e=1+1/1!+1/2!+1/3!+..+1/n! 注意:用 double 型数据计算输出语句:printf(\ #include int main() {

double e=1.0,f=1.0; int n,i;

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

f=f/i; e=e+f; }

printf(\ }

5.36 编程计算

编写程序,输入n的值,求 :1-1/2+1/3-1/4+1/5-1/6+1/7-...+1/n (保留四位小数) #include int main() {

int i, sign = 1, n; float s = 0.0, t; scanf(\ for (i = 1; i <= n; i ++)

{ t = 1.0 / (sign * i); sign = -sign; s += t; } printf(\ return 0; }

5.37 cos(x)-x=0

- 20 -

利用以下所示的简单迭代方法求方程:cos(x)-x=0的一个实根。 Xn+1=cos(Xn) 迭代步骤如下:

(1)取X1初值为0.0;

(2)X0=X1,把X1的值赋给X0; (3)X1=cos(X0),求出一个新的X1;

(4)若X0-X1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2);

(5)所求X1就是方程cos(X)-X=0的一个实根,输出X0,输出语句为printf(\。 #include #include int main() { double x1,x2; scanf(\ x2=cos(x1); while(fabs(x2-x1)>0.000001) { x1=x2; x2=cos(x1); } printf(\}

选做 5.38 SIX+SIX+SIX=NINE+NINE

计算出自然数SIX和NINE(它们满足的条件是SIX+SIX+SIX=NINE+NINE)的个数cnt。其中的S,I,X,N,E各代表一个十进制数字。输出语句:printf(\ #include #include int main() {

int S,I,X,N,E,cnt=0; for(S=1; S<=9; S++) for(I=0; I<=9; I++)

for(X=0; X<=9; X++)

for(N=1; N<=9; N++) for(E=0; E<=9; E++)

if(3*(100*S+10*I+X)==2*(1010*N+100*I+E)) cnt++; printf(\

return 0; }

选做 5.39 C减式 编程,求解下列算式中各字母所代表的数字并输出。 PEAR - ARA ─────── PEA #include #include int main() {

int p,e,a,r,n,c,b;

for(n=1000;n<=9999;n++) {

p=n/1000; e=n/100; a=n/10; r=n;

c=101*a+10*r; b=100*p+10*e+a; if(n-c==b) break; }

printf(\ return 0; }

选做 5.40 求A的值

求满足A*B=N,使A+B最小,且A,B(A<=B)为正整数的A的值。 输入:正整数N 输出:满足条件的A #include #include #include int main() {

int n, a, b, i, j; scanf (\ a = sqrt (n); b = sqrt (n);

for (i = a; i >= 0; i--) {

for (j = b; j <= n; j++)

- 21 -

{

if ( (n == i * j) && (n % i == 0) && (n % j == 0) && (i + j >= 2 * a)) break; }

if ( (n == i * j) && (n % i == 0) && (n % j == 0) && (i + j >= 2 * a)) break; }

printf (\ return 0; }

选做5.41 求一个三位数,其值等于其各位阶乘之和 编写程序,求某三位数,该数值的大小正好是组成这个数的三个位上的数字阶乘之和。 输出格式:printf(\#include int main()

{int a,b,c,i,j,k,s1,s2,s3; for(a=1;a<=9;a++) for(b=1;b<=9;b++) for(c=1;c<=9;c++) {s1=1;s2=1;s3=1; for(i=1;i<=a;i++) s1*=i;

for(j=1;j<=b;j++) s2*=j;

for(k=1;k<=c;k++) s3*=k;

if(100*a+10*b+c==s1+s2+s3) printf(\}

选做5.42 谁的饭量大

3个人比饭量大小,每人说了2句话。 A说:B比我吃得多,C和我吃得一样多。 B说:A比我吃得多,A也比C吃得多。 C说:我比B吃得多,B比A吃得多。

事实上饭量越小的人讲对的话越多。请编写程序按A、B、C的顺序输出3个人的饭量排名(排名越大,饭量越大)。 #include void main() {

int A,A1=0, B,B1=0, C,C1=0;

for(A=0; A<3;A++) for(B=0; B<3;B++) for(C=0; C<3;C++) {

A1 += B-A>0?1:0; A1+=(C==A?1:0); B1 += A-B>0?1:0; B1+=A-C>0?1:0; C1 += C-B>0?1:0; C1+=B-A>0?1:0;

if((A-C)*(C1-A1)>0||(A-C==0&&C1-A1==0)) if((B-C)*(C1-B1)>0||(B-C==0&&C1-B1==0)) if((B-A)*(A1-B1)>0||(B-A==0&&A1-B1==0)) {

printf(\ printf(\ printf(\ }

A1=0; B1=0; C1=0; } }

选做5.43 跳水排名

五位跳水选手将参加10m高台跳水,有好事者让5人据实力预测比赛结果。 A选手说:B第二,我第三。 B选手说:我第二,E第四。 C选手说:我第一,D第二。 D选手说:C最后,我第三。 E选手说:我第四,A第一。 决赛成绩公布之后,每位选手的预测都只说对一半,请编程输出比赛的实际名次。 #include void main() {

int a,b,c,d,e;

for(a=1;a<=5;a++) for(b=1;b<=5;b++) for(c=1;c<=5;c++) for(d=1;d<=5;d++) for(e=1;e<=5;e++)

if((b==2)+(a==3)==1&&(b==2)+(e==4)==1&&(c==1)+(d==2)==1&&(c==5)+(d==3)==1&&(e==4)+(a==1)==1&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e)

//printf(\

printf(\第一名是B\\n第二名是D\\n第三名是A\\n第四名是E\\n第五名是C\\n\

- 22 -

}

选做5.44 谁是最好的赛车

4名专家对4款赛车进行评论。 A说:2号赛车是最好的。 B说:4号赛车是最好的。 C说:3号不是最佳赛车。 D说:B说错了。

事实上只有一款赛车最佳,且只有一名专家说对了,其他3人都说错了。请编程输出最佳车的车号,以及哪位专家说对了。 #include int main() {

int i,j,t;

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

t=(i==2)+(i==4)+(i!=3)+(i!=4); if(t==1)break; }

printf(\号赛车是最佳赛车\\n\ if(i==2)printf(\说对了\ if(i==4)printf(\说对了\ if(i!=3)printf(\说对了\

if(i!=4) printf(\专家说得对\\n\ return 0; }

选做5.46 求小球弹跳的高度

小球从一定的高度自由落下,每次落地后反跳回原高度的一半;再落下,编写程序,输入一个高度(double类型),求它在第 10 次落地时,共经过多少米?第 10 次反弹多高? (输出结果时保留2位小数) #include \void main() { double s=0.0,h; int i; scanf(\ s=h; for(i=1;i<10;i++) { s=s+h; h=h/2; }

h=h/2;

printf(\is:%.3lf\\n\}

total is:%.3lf\\nThe tenth

选做5.47 ABC各教哪门课

A、B、C是小学老师,各教2门课,互不重复。共有如下6门课:语文、算术、政治、地理、音乐和美术。已知:

(1)政治老师和算术老师是邻居。 (2)地理老师比语文老师年龄大。 (3)B最年轻。 (4)A经常对地理老师和算术老师讲他看过的文学作品。

(5)B经常和音乐老师、语文老师一起游泳。 请编程输出A、B、C各教哪两门课。 #include int main() {

int w,s,z,d,y,m; //语文 数学 政治 地理 音乐 美术 int A=1,B=2,C=3; int a[4]={0,0,0,0},i; char c[5];

c[1]='A';c[2]='B';c[3]='C'; for(w=1;w<=3;w++) for(s=1;s<=3;s++) for(z=1;z<=3;z++) for(d=1;d<=3;d++) for(y=1;y<=3;y++) for(m=1;m<=3;m++) {

a[0]=(((z==B)||(s==B))&&(!((z==B)&&(s==B)))); a[1]=(((A==d)||(C==d))&&(B!=d));

a[2]=(((A==w))&&(((B==d)&&(C==s))||((B==s)&&(C==d))));

a[3]=(((B!=y)&&(B!=w))&&(((A==y)&&(C==w))||((A==w)&&(C==y))));

if(((a[0]+a[1]+a[2]+a[3])==4)&&((w+s+z+d+y+m)==(1+1+2+2+3+3))) {

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

- 23 -

if(w==i) printf(\语文课是%c教的\\n\

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

if(s==i) printf(\算术课是%c教的\\n\ for(i=1;i<=3;i++)

if(z==i) printf(\政治课是%c教的\\n\ for(i=1;i<=3;i++)

if(d==i) printf(\地理课是%c教的\\n\ for(i=1;i<=3;i++)

if(y==i) printf(\音乐课是%c教的\\n\ for(i=1;i<=3;i++)

if(m==i) printf(\美术课是%c教的\\n\ } } return 0; }

选做5.48 求各位数字之和等于5且能被5整除的整数

输入正整数 M 和 N(M,N 均小于 10000) ,输出 M 和 N 之间所有满足下列条件的所有整数:整数能被 5 整除且各位数字之和等于 5 。若没有满足条件的整数 , 则输出“No output\\n”。 输入: 整数区间 m,n 输出: 各位数字之和等于 5 且能被 5 整除的所有整数

#include\main()

{int i,m,n,a,b,c,p,k=0,q=1; scanf(\for(i=0;i<=n-m;i++) {p=m+i;

a=p;b=(p0-a)/10;c=(p00-b*10-a)/100; if(a+b+c==5&&p%5==0)

{printf(\}

if(k==0) printf(\}

选做5.50 分数的四则运算

在小学时我们就学习了分数的四则运算,即对两个分数进行加、减、乘、除等运算,现在我们尝试下用C语言来实现。

输入:分数1 操作符 分数2 输出:计算结果

要求:计算结果使用分数表示,并且为最简化。例如结果为2/6,则被简化为1/3 #include #include main() {

int a,b,c,d,i,x,y; char op;

scanf(\ if(a==0||c==0) exit(0);

if(op=='+'){y=b*c+d*a;x=a*c;} if(op=='-'){y=b*c-d*a,x=a*c;} if(op=='*'){y=b*d;x=a*c;} if(op=='/'){y=b*c;x=a*d;} if(y==0&&x!=0)

{ printf(\ else if(x==0) exit(0); if(x>y) i=y; while(i>1) {

if(x%i==0&&y%i==0){x=x/i;y=y/i;continue;} i--; }

if(x/i==1)

printf(\ else

printf(\}

6.1 谁能出线

背景:电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。按规定,每10名学生为一个预赛小组,评委打出分数(0~100分),各小组第一名可以进入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。 输入:按顺序给出一个小组10个人的最后得分(int)。

输出:能够出线的学生序号(0~9)。 #include #define N 10 int main() {

int a[N]; int i,max;

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

- 24 -

{

scanf(\ }

max=a[0];

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

if(max

max=a[i]; } }

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

if(max==a[i]) printf(\ }

return 0; }

6.2 统计素数的个数

求出 2 到 m 之间 ( 含 m,m<=1000) 所有素数并放在数组 a 中。 输入:正整数m

输出:从小到大的所有素数,及个数(素数输出的时候用M来控制) 如: 输入:10 输出:2 3 5 7 4

#include #define M 1000 int main() {

int a[M]={0}; int i,j,k,n,cnt=0; scanf(\ for(i=2;i<=n;i++) {

for(j=2;j

for(k=0;k

printf(\

printf(\ return 0; }

6.3 冒泡法排序

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

编写程序,对输入的十个数按照从小到大排序 #include int main() {

int a[10]; int i,j,t;

for(i=0;i<10;i++) scanf(\ for(j=1;j<=10;j++) { for(i=0;i<10-j;i++) if(a[i]<=a[i+1]) { t=a[i];

a[i]=a[i+1]; a[i+1]=t; } printf(\ } printf(\}

6.4 插入法排序

如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素

- 25 -

依然保持有序。

定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。 #include int main() {

int a[11]; int i,j,t,n,m;

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

{scanf(\ scanf(\

a[10]=n; m=a[0];

for(i=1;i<11;i++) if(m>=a[i]) m=a[i]; printf(\

for(j=1;j<=11;j++) {

for(i=0;i<11-j;i++) if(a[i]<=a[i+1]) {

t=a[i];

a[i]=a[i+1]; a[i+1]=t; }

if(a[i]!=m)

printf(\ }

printf(\ return 0; }

6.5 二维数组

程序定义了 4× 4 的二维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n 。

例如:数组中的值为

假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即M) #include

#define M 4 int main() {

int a[M][M]; int i,j,n;

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

for(j=0;j<=3;j++)

scanf(\ scanf(\ for(i=0;i<=3;i++)

for(j=0;j<=3;j++) {

if(j<=i)

a[i][j]=n*a[i][j]; }

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

for(j=0;j<=3;j++)

printf(\ printf(\ }

return 0; }

6.6 在屏幕上显示杨辉三角形

杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。

其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而贾宪三角的发现就是十分精彩的一页。

杨辉三角有如下性质:

1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。

2、第n行的数字个数为n个。

3、每个数字等于上一行的左右两个数字之和。 编写程序,输入正数n, 将所有数据存储到二维数组中,并在屏幕上显示对应的杨辉三角形(注意数据之间的空格)。例如:n=5 图形如下: 1 1 1 1 2 1

1 3 3 1

1 4 6 4 1 1 5 10 10 5 1

- 26 -

#include #define M 100 int main() {

int a[M][M]; int i,j,n;

scanf(\ for(i=0;i<=n;i++) for(j=0;j<=n;j++) {

if(i==j||j==0) a[i][j]=1; }

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

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<=n;i++) {

for(j=0;j<=n;j++) if(j<=i)

printf(\ printf(\ }

return 0; }

6.7 求二维数组周边元素之和

编写一个程序,求出4×5的二维数组周边元素之和。

输入:二维数组元素 输出:周边元素之和 如: 输入: 1 3 5 7 9 2 9 9 9 4 6 9 9 9 8 1 3 5 7 0 输出:61

#include #define M 4 int main() {

int a[M][M+1]; int i,j,sum=0; for(i=0;i<4;i++)

for(j=0;j<5;j++) {

scanf(\

if(i==0||i==3||j==0||j==4) sum+=a[i][j]; }

printf(\ return 0; }

6.8 存储并输出一个矩阵

编程,输入 n ,存储并输出如下例( n=5 )所示的 图形。 1 2 3 4 5 1 1 2 3 4 1 1 1 2 3 1 1 1 1 2 1 1 1 1 1

#include #define M 100 int main() {

int a[M][M]; int i,j,n;

scanf(\ for(i=0;i

for(j=0;j

if(j<=i) a[i][j]=1; if(j>i) a[i][j]=j-i+1; } for(i=0;i

for(j=0;j

printf(\ printf(\ } }

6.9 巧分橘子

一家农户以果园为生,一天,父亲拿出一堆橘子,共2520个,准备分给他的6个儿子。父亲按事先写在一张纸上的数字把这堆橘子分完,每个人分到的橘子的个数都不相同。然后他说:“老大,把你分到的橘子分1/8给老二,老二拿到后,连同原来的橘子分1/7给老三,老三拿到后,连同原来的橘

- 27 -

子分1/6给老四,以此类推,最后老六拿到后,连同原来的橘子分1/3给老大,这样,你们每个人分到的橘子就一样多了。”问兄弟6人原先各分到多少只橘子。 请将兄弟6人的橘子数存储到一维数组中,并按照下列各式输出(下面只提供格式,数据不准确): x[1]=111 x[2]=222 x[3]=333 x[4]=444 x[5]=555 x[6]=666 #include void main() { int a[6],b[6],i; for(i=0;i<6;i++) { a[i]=2520/6; b[i]=8-i; }

a[0]=a[0]-(a[5]/(b[5]-1)); for(i=5;i>=1;i--) { a[i]=a[i]+(a[i]/(b[i]-1))-(a[i-1]/(b[i-1]-1)); }

a[0]=a[0]*b[0]/(b[0]-1); for(i=0;i<6;i++) printf(\}

c[i]=a[i]; }

for(j=1; j<=10; j++)

for(i=1; i<11-j; i++) if(a[i]>=a[i+1]) {

t=a[i];

a[i]=a[i+1]; a[i+1]=t; }

for(m=1; m<11; m++) for(i=1; i<11; i++) if(c[m]==a[i]) {

printf(\ break; } printf(\ return 0; }

选做题 6.1 大家一起做游戏

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

每个小朋友都希望自己能有更多的练习数数的机会,所以都希望成为最终被留下的那位。

现在,请大家帮小朋友们计算一下,在第一次排号的时候排到第几位才能成为最终被留下的小朋

6.10 给数组中的元素按顺序编号 友。 对数组 a[10] 中的十个整数从小到大进行输入:小朋友的个数(<=50),要被练习的数字 连续编号,输出各个元素的编号。要求不能改变数输出:最终被留下的小朋友的序号 组 a 中元素的顺序,且相同的整数要具有相同的编说明:如“要被练习的数字”是5,则每次数到5号。例如数组是: A=(5,3,4,7,3,5,6,8,9,10) 则输出为: 的同学要退出该游戏 (4,1,3,7,1,4,6,8,9,10) #include #include void main() int main() { { int N,n,i,s=0,a; int a[11],c[11]; scanf(\ int i,j,t,m; for(i=2;i<=N;i++) for(i=1; i<11; i++) s=(s+n)%i; { a=s+1; scanf(\ printf(\

- 28 -

}

选做题6.2 猜数字

有如下一组数字,其中每个数字都在 1 ~ 63 之间, 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63

2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 34 35 38 39 42 43 46 47 50 51 54 55 58 59 62 63

4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 36 37 38 39 44 45 46 47 52 53 54 55 60 61 62 63

8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 40 41 42 43 44 45 46 47 56 57 58 59 60 61 62 63

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

现在需要编写一个程序,当从键盘输入某数字在且仅在哪几行出现了,该程序可以“猜”出这个数字是几。

输入:程序的输入是一串以空白符分开的数字,当输入 0 时表示输入结束。 输出:输出猜到的数字。 #include #include void main() {

int i,sum=0; do {

scanf(\

sum=sum+pow(2,i-1); }while(i!=0);

printf(\}

选做题 6.3 小蜜蜂

一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。

请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。 输入:分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a

void main() {

int a,b,x,i; int f[100]; f[1]=1;f[2]=2;

scanf(\ x=b-a; if(x==1)

printf(\ if(x==2)

printf(\ if(x>=3) {

for(i=3;i<=x;i++) f[i]=f[i-1]+f[i-2]; printf(\ } }

选做题 6.4 数制转换

我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。

这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。 程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。

求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。信息的格式见测试用例。 #define N 50

#include\ #include\ int main() { char a[N],b[N],d[N],e[N],d0[N]; int i,j,o,r,g,h,w,t,l,k,max1,max2; double

p[N],q[N]={0},u[N],v[N]={0},c[N],f[N],m,n; for(i=0;i

- 29 -

{ scanf(\ if(a[i]=='\\x20') { l=i; break; } } gets(d); if(d[0]!='\\x20') {k=strlen(d); goto C;} if(d[0]=='\\x20') { strcpy(d0,d); g=strlen(d0); for(i=0;d0[i]=='\\x20';i++); j=i; for(i=0;i

C:for(i=0;i='\\x30') c[i]=b[i]-'0'; if(b[i]<='\\x5A'&&b[i]>='\\x41') c[i]=b[i]-'7'; } for(i=0;i

if(e[i]<='\\x39'&&e[i]>='\\x30') f[i]=e[i]-'0'; if(e[i]<='\\x5A'&&e[i]>='\\x41') f[i]=e[i]-'7'; } max1=c[0]; for(i=1;i

if(max1==0) max1=1; max2=f[0]; for(i=1;i

if(max2==0) max2=1; for(i=max1+1;i<=36;i++) {

for(j=0;j

for(i=max2+1;i<=36;i++) { for(j=0;j

for(g=max1+1;g<=36;g++) for(h=max2+1;h<=36;h++) { if(q[g]==v[h]) { w=g,t=h; goto out; } } for(i=0;i

- 30 -

outs:; }

选做题 6.5 等值数列段

如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。

输入:由N个元素组成的整数数列A(其中N<=50) 输出:A中长度最大的等值数列段的始末位置,如果没有等值数列段,则输出No equal number list. 说明:始末位置是指数组下标,即0表示第一个元素。

如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。

当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。 #include void main() {

int a[50]; int f[10]={0};

int n,i,j,k=-1,t,q,s,o,o1,count=1,max=-1; scanf(\ for(i=0;i<=n-1;i++) scanf(\ do{

for(j=0;j<=n-1;j++) {

if(a[j]==a[j+1]) {

count=count+1; k=count;

f[j+1]=f[j+1]+k; }

if(a[j]!=a[j+1]) {

count=1; continue; }

max=k; }

}while(max

printf(\ //for(q=0;q<=n-1;q++)

//printf(\ //printf(\ else{

o=f[0];

for(s=1;s<=n-1;s++) {

if(f[s]>o) {

o=f[s]; o1=s; } }

//printf(\ //printf(\

printf(\to %d.\\n\ } }

选做6.6 邮票组合

背景:我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。

现在,邮局有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分也可以。显然不同邮票的组合都可以得到同样一种邮资。

#include

int neng(int a[],int max) { int i,j,k,m,n;

- 31 -

int sum; for(i=0;i<5;i++) for(j=0;j<5;j++) for(k=0;k<5;k++) for(m=0;m<5;m++) for(n=0;n<5;n++) { sum=a[i]+a[j]+a[k]+a[m]+a[n]; if (sum==max) return 1; } return 0; }

void main() { int a[5],i; int max=0; a[4]=0; scanf(\ while(1) { if(neng(a,max)) { max++; } else break; } printf(\}

选做6.7 十进制数转换为16位二进制数 将任一正整数(<65536)转换为 16 位二进制形式。 输入: 正整数

输出: 正整数的 16 位二进制数

友情提示:定义一个整型数组,数组有16个元素,保存变换后的二进制数。 #include void main() {

int n,i; int a[16];

scanf(\ if(n>0&&n<65536) {

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

a[i]=n%2; n=n/2; }

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

printf(\}

选做6.8 求各位数字组成的最大数

任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。 输入: 自然数 n

输出: 各位数字组成的最大数 #include #include void main() {

int n,i,j,max; int a[4];

scanf(\ for(i=0;i<=3;i++) {a[i]=(n); n=n/10;}

for(j=0;j<=3;j++) for(i=0;i<3-j;i++) if(a[i+1]>a[i]) {

max=a[i]; a[i]=a[i+1]; a[i+1]=max; }

for(i=0;i<=3;i++) printf(\ printf(\}

选做题6.9 折半插入排序

排序是程序设计中的重要内容之一,据不完全统计,在一般的数据处理程序中,排序占去了处理机时间的四分之一,而在典型的安装程序中,一半以上的时间用在对表的排序上。

- 32 -

常用的排序算法有:直接插入排序,折半插入排序,希尔排序,起泡排序,快速排序,选择排序,堆排序等。其中直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。在直接插入排序中,为了找到插入位置,采用了顺序查找的方法。为了提高查找速度,可以采用折半查找,这种排序称折半插入排序。

折半查找法先取有序数组的中间元素与查找值相比较。如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较。如查找值小于中间元素,则再取低半部的中间元素与查找值相比较。如此重复直到查找成功或最终未找到该数为止。在折半插入排序算法中,由于进行关键字比较的次数比较少,所以算法的效率就比较高。 例如:有序列10,90,80,30,20,15。我们进行折半插入排序的过程如下: 初始(第1趟):有序子序列为空。待排序数据为10,则不需要进行关键字比较,直接插入。 第2趟:有序子序列为“10”,待排序数据为90,进行1次比较就可以确定插入位置,得到长度+1的有序子序列“10,90”。此时比较次数为 1 。 第2趟:有序子序列为“10,90”。待排序数据为80,取有序序列中间(取整)的元素10进行第 1 次比较,80大;则应该从“90”这个子序列中进行折半插入80,进行第 2 次比较,定位应该的插入位置,得到有序序列“10,80,90”。此趟比较次数为 2。 第3趟:有序子序列为“10,80,90”。待排序数据为30,取有序序列中间的元素80进行第 1 次比较,30小;则应该从“10”这个子序列中进行折半插入30,进行第 2 次比较,可以定位应该插入的位置,得到新的长度+1的有序子序列。此趟比较次数为 2。

第4趟:有序子序列为“10,30,80,90”。待排序数据为20,取有序序列中间的元素30进行第 1 次比较,20小;则应该从“10”这个子序列中进行折半插入20,进行第 2 次比较,可以确定应该插入的位置。此趟比较次数为 2。

第5趟:有序子序列为“10,20,30,80,90”。待排序数据为15,取有序序列中间的元素30进行第 1 次比较,15小;则应该从“10,20”这个子序列中进行折半插入15,取子序列中间的元素10,进行第 2 次比较,15大,则应该从“20”这个子序列中进行

折半插入排序,再进行 1 次比较就可以确定应该插入的位置。此趟比较次数为 3。

此时,完成排序,得到升序序列“10,15,20,30,80,90”。在整个排序过程中进行关键字比较的总次数 = 0+1+2+2+2+3 = 10。 输入:数列中元素个数(元素数量<=100) 数列

输出:使用折半插入排序后的有序升序数列

在折半插入排序过程中进行关键字比较的次数

说明:输出个数列之间用空格分隔 #include int main(){

int n,a[100],b[100],i,j,count=0,lengthb=1; scanf(\ for(i=0;i

scanf(\ b[0]=a[0]; for(i=1;i

int c=0,d=lengthb-1,flag=0; do {

if(a[i]>b[(c+d)/2]){ //待插入数字大于中间值

c=(c+d)/2+1; count++; } else {

if(a[i]

d=(c+d)/2-1; count++; } else {

count++; flag=1; break; } } }

while(c<=d);

//处理最后一个数字 if(flag==0){

for(j=i-1;j>=c;j--){ b[j+1]=b[j];

- 33 -

} b[c]=a[i]; lengthb++; } }

for(i=0;i

if(i!=lengthb-1)printf(\ }

printf(\ return 0; }

8.1 合并字符串

输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。

输入:两个已经排好顺序(升序)的两个字符串 输出:一个合并在一起的有序(升序)的字符串 要求:设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。

如果采用先进行串连接,然后再进行排序的算法,则效率太低了。 #include #include #include int main() {

char a[100],b[100],t; int k,i,j; gets(a); gets(b); strcat(a,b); k=strlen(a); for(j=1;j<=k;j++) for(i=0;i=a[i+1]) {

t=a[i];

a[i]=a[i+1]; a[i+1]=t; } puts(a); return 0; }

8.3 删除重复字符 背景:

输入一个长度不超过 100 的字符串,删除串中的重复字符。 输入:

输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。 输出:

删除重复字符后的字符串。例如:abced。 #include #include #include int main() {

char a[100],b[100]; int n,i,j,cnt=1; gets(a); n=strlen(a); b[0]=a[0];

for(i=1;i

for(j=0;j

if(a[i]==a[j]) break; }

if(a[i]==a[j]&&i==j) {

b[cnt]=a[i]; cnt++; } }

for(i=0;i

printf(\ printf(\ return 0; }

8.4 删除字符串中指定字符

输入两个字符串 s1 和 s2 ,在 s1 中删除任何 s2 中有的字符。例如, s1 :“ abc123ad ”, s2 :“ a1 ” ,则输出“bc23d ”。 输入: 两个字符串 s1 和 s2 输出: 删除后的字符串 s1 #include

- 34 -

#include #include int main() {

char a[100],b[100],c[100]; int x,y,i,j,cnt; scanf(\ scanf(\ x=strlen(b); y=strlen(a); for(j=0;j

cnt=0;

for(i=0;i

c[cnt]=a[i]; cnt++; }

strcpy(a,c); y=cnt; }

for(i=0;i

8.5 单词有多少

用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词 \时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。

输入: 多个字符串 输出: 单词的数量 #include #include #include void main() {

int count=0; char *word ; while(1) {

word=(char *) malloc (sizeof(char)*20);

scanf(\ ++count;

if(0==strcmp(word,\ break; free(word); }

printf(\ }

8.6 在指定位置插入字符串

输入两个字符串 s1 、 s2 和 s1 中任意字符 k ,在 s1 中的指定字符 k 第一次出现的位置处插入字符串 s2 并输出。

输入: 两个字符串 s1 、 s2 和 s1 中任意字符 k 输出: 插入后的字符串 s1 #include #include void main() {

char s1[100],s2[100],s3[100]; char c;

int i,j,n,t,count=-1; gets(s1); gets(s2); n=strlen(s1); t=strlen(s2); scanf(\ for(i=0;i<=n-1;i++) {count=count+1; if(c==s1[i]) break;}

for(i=0;i

for(i=count;i

for(i=count+t;i<=n+t;i++) s3[i]=s1[i-t]; puts(s3);

/*for(i=0;i

printf(\ }

printf(\}

选做T 8.1 拱猪计分

- 35 -

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

我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至 13来代表A、2、?、Q、K等牌点,例如:H1为红心A,S13为黑桃K。 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,D11(羊)及C10(加倍)等16张牌。其它牌均弃置不计。若未持有这16张牌之任一张则以得零分计算。

若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。

若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50, -2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。

若红心牌H1至H13均在同一家,有下列情形: 所有红心牌以+200分计算。

若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。

而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 除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。 #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,

- 36 -

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

选作T 8.2 合并果子

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在

合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。 输入:输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=10000)是第i种果子的数目。

输出: 输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。

#include #include #include void main() {

int i,j,k,t,n,sum=0; int a[10]={0}; int b[10]={0}; char s[10][100]; scanf(\ for(i=1;i<=n;i++) scanf(\ for(t=1;t<=n;t++) a[t]=strlen(s[t]); for(i=1;i<=n;i++) for(j=0;j

for(i=0;i<=a[j]/2-1;i++) {

t=s[j][i];

s[j][i]=s[j][a[j]-1-i]; s[j][a[j]-1-i]=t; } }

for(j=1;j<=n;j++)

- 37 -

{

for(i=0;i<=a[j];i++) {

b[j]=b[j]+s[j][i]*pow(10,i); } }

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

if(b[i]>b[i+1]) {

t=b[i];

b[i]=b[i+1]; b[i+1]=t; } }

sum=(n-1)*(b[1]+b[2]); for(i=2;i<=n-1;i++) sum=sum+(n-i)*b[i+1]; printf(\}

选作T 8.3 安全的密码

随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。

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

小林正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。 应当按照以下的规则来判断密码是否安全: 如果密码长度小于 6 位,则不安全

如果组成密码的字符只有一类,则不安全 如果组成密码的字符有两类,则为中度安全 如果组成密码的字符有三类或以上,则为安全 通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。

输入:输入的第一行是一个整数 N,表明后面有多少

组密码。随后的 N 行输入包括 N 个密码,每个密

码的长度均小于 20 个字符。

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

41234abcdefABC1231#c3Gh输出样例 Not SafeNot SafeMedium SafeSafe #include #include void main() {

int n,i,j,k,t,flag1=0,flag2=0,flag3=0,flag4=0; char s[20][50]; scanf(\ for(i=0;i<=n;i++) gets(s[i]);

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

t=strlen(s[i]); if(t<6)

printf(\ if(t>=6) {

for(flag1=0,flag2=0,flag3=0,flag4=0,j=0;s[i][j]!='\\0';j++)

{

if(s[i][j]>=48&&s[i][j]<=57) flag1++;

if(s[i][j]>=65&&s[i][j]<=90) flag2++;

if(s[i][j]>=97&&s[i][j]<=122) flag3++;

if((s[i][j]>=33&&s[i][j]<=47&&s[i][j]>=58&&s[i][j]<=64&&s[i][j]>=91&&s[i][j]<=96&&s[i][j]>=123&&s[i][j]<=126)||(s[i][j]==' ')) flag4++; }

if(flag1==t||flag2==t||flag3==t||flag4==t) printf(\

- 38 -

if((flag1*flag2>0&&flag3==0&&flag4==0)||(flag1*flag3>0&&flag2==0&&flag4==0)||(flag1*flag4>0&&flag2==0&&flag3==0)||(flag2*flag3>0&&flag1==0&&flag4==0)||(flag2*flag4>0&&flag3==0&&flag1==0)||(flag3*flag4>0&&flag1==0&&flag2==0)) printf(\

if((flag1*flag2*flag3>0&&flag4==0)||(flag1*flag2*flag4>0&&flag3==0)||(flag1*flag4*flag3>0&&flag2==0)||(flag4*flag2*flag3>0&&flag1==0)||(flag1*flag2*flag3*flag4>0))

printf(\ } } }

选作T 8.4 扫雷

背景 :你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?在游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的 4x4 的地图(*表示地雷):

*........*...... 根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:

*10022101*101110 每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。

输入 :输入中将包括一系列的地图,每个地图的第一行有两个整数 n 和 m(0

Field #x:其中 x 是当前地图的编号(从 1 开始)。下面的 n 行则将地图中的 \以数字表示,该数字表示该方格周围有多少颗地雷。 #include #include #include # define N 9 void main() {

int i,j,k,t=1,x1,x2; int n[100],m[100];

char c[100][100][100]; char s[100][100][100]; for(k=1;k<=N;k++) {

scanf(\ if(n[k]==0&&m[k]==0) break; t++;

for(j=0;j

scanf(\ }

for(j=0;j

for(i=0;i

for(i=0;i

if(c[k][j][i]=='*') {

s[k][j][i]=c[k][j][i]; } } }

for(j=0;j

for(i=0;i

if(c[k][j][i]=='*') {

s[k][j][i]=c[k][j][i]; if(j==0&&i==0) {

for(x1=0;x1<=1;x1++) for(x2=0;x2<=1;x2++) if(s[k][j+x1][i+x2]!='*') {

s[k][j+x1][i+x2]++; } }

if(j==0&&i>0) {

for(x1=0;x1<=1;x1++)

- 39 -

for(x2=-1;x2<=1;x2++) if(s[k][j+x1][i+x2]!='*') {

s[k][j+x1][i+x2]++; } }

if(i==0&&j>0) {

for(x1=-1;x1<=1;x1++) for(x2=0;x2<=1;x2++) if(s[k][j+x1][i+x2]!='*') {

s[k][j+x1][i+x2]++; } }

if(i>0&&j>0) {

for(x1=-1;x1<=1;x1++) for(x2=-1;x2<=1;x2++) if(s[k][j+x1][i+x2]!='*') {

s[k][j+x1][i+x2]++; } } } } } }

for(k=1;k<=t-1;k++) {

printf(\ for(j=0;j

for(i=0;i

if(k!=t-1) printf(\ } }

选作T8.5 身份证的奥秘

背景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)

(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

- 40 -

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

Top