当前位置:文档之家› 石油大学试题

石油大学试题

1.1 Hello world.
让我们用C语言向世界问好。
最早的程序基本是这个样子的:
程序一:
#include
void main()
{
printf("Hello world.\n");
}
程序二:
#include
int main()
{
printf("Hello world.\n");
return 0;
}
上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。
输入:无
输出:Hello world.
#include
int main()
{
printf("Hello world.\n");
}
1.2 Welcome to Beijing.
让我们来练习如何显示多行文字。
输入:无
输出:就是下面的那段文字。
#include
void main()
{printf("Welcome\n");
printf("to\n");
printf("Beijing.\n");
}
1.3 练习最简单的printf和scanf
printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。
输入:整型变量x的值。
输出:输出整型变量x对应的十进制、八进制和十六进制形式。
认真观察-1的八进制和十六进制输出,请想想是为什么。
#include
int main()
{int x;
scanf("%d",&x);
printf("x=%d,",x);
printf("x=%o,",x);
printf("x=%x\n",x);
return 0;
}
1.4 练习两个整数之间的运算
背景:基本练习。
输入:接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444
输出:分别输出进行+、-、*、/、*之后的运行结果。
#include
int main()
{int x,y;
scanf("%d%d",&x,&y);
printf("%d+%d=%d\n",x,y,x+y);
printf("%d-%d=%d\n",x,y,x-y);
printf("%d*%d=%d\n",x,y,x*y);
printf("%d/%d=%d\n",x,y,x/y);
printf("%d%%%d=%d\n",x,y,x%y);
return 0;
}
1.5 学习打印你的第一个图形
背景:我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。
程序如下:
#include
int main()
{
printf("****\n");
printf("****\n");
printf("****\n");
printf("****\n");
return 0;
}
要求:按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。
输入:无。
输出:指定图形。
#include
int main()
{
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
printf("*******\n");
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("%d",&N);
if(N<=16)
{for (i=1;i<=N;i++)
sum=sum*i;
printf("%d\n",sum);
}
if(N>=17)
printf("N is too big!\n");
}
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("%f%f",&x,&eps);
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("%f\n",sin(x));
system("PAUSE");
return 0;
}
2.3 判断输入的字符的类型
我们将字符分为五类:大写字母、小写字母、数字、控制字符、其他字符。
编写程序,从键盘输入一个字符,输出字符所属的类型:大写字母时输出capital letters, 小写字母时输出small letters,数字是输出figures,其他字符时输出 others。
#include
void main()
{
char c;
c = getchar ( );
if (c < 0x20)
printf ("The character is a control character\n");
else if (c >= '0' && c <= '9')
printf ("figures\n");
else if (c >= 'A' && c <= 'Z')
printf ("capital letters\n");
else if (c >= 'a' && c <= 'z')
printf ("small letters\n");
else
printf ("others\n");
}
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("%d",&x);
x1=x/50;
x2=x%50/10;
x3=x%50%10/5;
x4=x%50%10%5/2;
x5=x%50%10%5%2/1;
printf("%d\n",x1);
printf("%d\n",x2);
printf("%d\n",x3);
printf("%d\n",x4);
printf("%d\n",x5);
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 "stdio.h"
#include "math.h"
int main()
{
int h,m;
double angle;
scanf("%d%d",&h,&m);
angle=fabs(5.5*m-30*h);
if(angle>180)
angle=360-angle;
printf("At %d:%02d the angle is %.1f degrees.\n",h,m,angle);
}
3.3 照猫画猫:计算圆柱的侧面积及体积
如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2πrh ,体积 v=π r 2 h 。其中 π=3.1415926
输入 第一行输入圆柱的底面半径 r
第二行输入圆柱的高 h
输出 s=< 圆柱的侧面积 >,v=< 圆柱的体积 >
要求 1. 所有变量都定义为双精度类型
2. 结果精确到小数点后两位
#include "stdio.h"
#define n 3.1415926
int main()
{
float r,h,s,v;
printf;
scanf("%f%f",&r,&h);
s=2*n*r*h;
v=n*r*r*h;
printf("s=%6.2f,v=%6.2f\n",s,v);
}
3.4 分离整数
任意从键盘上输入一个三位正整数,要求正确地分离出它的个位、十位和百位,并分别在屏幕上输出。
比如输入的三位正整数
#include "stdio.h"
int main()
{
int x,hundreds,tens,units;
printf;
scanf("%d",&x);
hundreds=x/100;
tens=x%100/10;
units=x%100%10;
printf("units=%d,tens=%d,hundreds=%d\n",units,tens,hundreds);
}
3.5 鸡兔同笼
已知笼中有头h个,有脚f条,问笼中鸡兔各有多少只?
输入:头和脚的数目
输出:兔子和鸡的数目(输出语句为:printf("rabbit=%d,chicken=%d",rabbit,chicken);)
Sample
输入:10 20
输出:rabbit=0,chicken=10
#include "stdio.h"
int main()
{
int chicken,rabbit,f,h;
scanf("%d%d",&h,&f);
rabbit=(f-2*h)/2;
chicken=(4*h-f)/2;
printf("rabbit=%d,chicken=%d\n",rabbit,chicken);
}
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("%d",&lx);
if(lx==1){
scanf("%lf",&f);
c=(f-32)*5/9;
printf("The Centigrade is %.2f\n",c);
}
else{
scanf("%lf",&c);
f=(c*9/5)+32;
printf("The Fahrenheit is %.2f\n",f);
}
}
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("%d",&x);
if(x<6)
y=x-12;
else if(x<15)
y=3*x-1;
else
y=5*x+9;
printf("%d\n",y);
return 0;
}
4.3 整数位数判断
输入一个不多于5位的正整数,要求: (1)求它是几位数;(2)逆序打印出各位数字。
#include
#include
#define SIZE 5
int
main(void)
{
int bit_count;//位数
long int input_num;//输入数
int result[SIZE];//存放各个位的数
int i;
scanf("%ld", &input_num);
if (input_num < 0 || input_num > 99999) {
printf("Invalid input\n");
exit(1);
}
for( bit_count = 0; input_num; ++bit_count) {
result[bit_count] = input_num % 10;
input_num /= 10;
}
printf("%d\n",bit_count);
for(i = 0; i < bit_count; ++i)
printf("%d",result[i]);
printf("\n");
exit(0);
}
4.4 四位数拆分
输入一个四位数,判断千位、百位、十位和个位数字之和是否为偶数,如果是,输出Yes,如果不是,输出No;如果不是四位数,输出Invalid data。
#include
void main()
{
int x,a,b,c,d,e;
scanf("%d",&x);
if(x/1000<1||x/10000>=1)
printf("Invalid data\n");
else {
a=x/1000;
b=x%1000/100;
c=x%1000%100/10;
d=x%1000%100%10;
e=(a+b+c+d)%2;
if(e==0)
printf("Yes\n");
else
printf("No\n");
}
}
4.5 磨磨你的砍柴刀:判断三角形的形状
要求:输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。
输入:三角型的3条边的长度(int型)。
输出:等边三角形:equilateral triangle.
等腰三角形:isoceles triangle.
不构成三角形:non-triangle.
一般三角形:triangle.
#include
void main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
if(a+bprintf("non-triangle.\n");
else if(a==b&&b==c)
printf("equilateral triangle.\n");
else if(a==b||b==c||a==c)
printf("isoceles triangle.\n");
else
printf("triangle.\n");

}
4.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;
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("\n");
}
4.7 判断某年某月的天数
一年有365天,有的月份有31天,有的有30天,2月份闰年的时候是29天,非闰年的时候是28天。现在要求从键盘上输入一个年份和月份,输出其对应的天数。
#include
main()
{ int year,month,days;
scanf("%d %d", &year,&month);
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("%d\n",days);
}
4.8 花多少钱买衣服
周末商场促销呢,某品牌服装既可以买套装,也可以买单件。若买的不少于50套,每套80元;不足50套的每套90元,只买上衣每件60元,只买裤子每条45元。编写程序,输入计划购买的上衣数量 a 和裤子的数量 b ,计算并输出应该付的款 m 。
#include
void main()
{
int a,b,y;
scanf("%d%d",&a,&b);
if(b<=a&&b<50)
y=90*b+(a-b)*60;
if(b<=a&&b>=50)
y=80*b+(a-b)*60;
if(ay=90*a+(b-a)*45;
if(a=50)
y=80*a+(b-a)*45;
printf("%d\n",y);
}
4.9 到邮局去寄包裹
你去邮局给朋友寄礼物。发现邮局对邮寄包裹的费用是这样规定的:如果包裹长宽高任意一个尺寸超过1米,或重量超过30千克,不予邮寄;对可以邮寄的包裹每件收手续费 0.2 元,不同重量的邮资按下表计算: 重量(千克)
收费标准(元)
小于10
0 . 80
大于等于10但不超过20


0 . 75
大于等于20但不超过30
0 . 70
编写程序,输入包裹的长、宽、高尺寸和重量,输出所需的邮资(输出结果中包含两位小数即可),超出尺寸或重量的输出 "Error” .
#include
void main()
{
float a,b,c,m,y;
scanf("%f,%f,%f,%f",&a,&b,&c,&m);
if(a>1||b>1||c>1||m>30)
printf("Error\n");
else {
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("%.2f\n",y);
}
}
4.10 输出星期几的英文表示
输入用数字(1--7)表示的星期几,输出星期几的英文表示,输入的数字有误,输出单词"Error(回车)"。
#include
void main()
{
int a;
scanf("%d",&a);
switch((int)(a))
{
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");break;
default:printf("Error\n");
}
}
5.1 输出一行星号
编写程序在一行中输出 N 个星号。
输入: N值
输出: 一行中N个星号
#include
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;iputchar('\n');
return 0;
}
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("%d,%c",&n,&p);
for(m=0;m{
for(i=0;i{
printf(" ");
}
for(d=0;d{
t=p+d+m;
printf("%c",t);
}
for(i=0;i{
printf(" ");
}
printf("\n");
}
}
5.3 空心的倒三角型
背景:请根据要求打印可空心倒三角形。
输入: 输入三角形的高度(h >0)。
输出:打印相应的空心倒三角形。图样参见测试用例。
#include
#include
int main()
{int h,i,j,k,m,n;
scanf("%d",&h);
if((h>1)&&(h%2!=0))
{
for(i=1; i<=(2*h-1); i++)
{
printf("*");
}
printf("\n");
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("\n");
}
for(n=1;n<=(h-1);n++)
{
printf(" ");
}
printf("*\n");
}
else
printf("Invalid input\n");
return 0;
}
选做 5.4 打印实心正方形
5.1题中你已经打印了一行*号,这次在屏幕上输出一个由星号组成的 n 行 n 列的正方形。
程序输入 n 值,输出如下例( n=4 )所示的高和上底均为 n 的正方形:
****
****
***

*
****
#include
#include
int main()
{
int a=1,n,b;
scanf("%d",&n);
while(a<=n)
{
b=1;
do
{
printf("*");
b++;
}
while(b<=n);
printf("\n");
a++;
}
return 0;
}
选做 5.5 空心字符菱形
输入:菱型起始字母和菱形的高度。
输出:参看测试用例,打印空心的由字符组成的菱形。
#include
#include
int main()
{
char ch;
int n,a=1,b,c;
scanf("%c %d",&ch,&n);
while(a<=n)
{
b=1;
while(b<=n-a)
{
printf(" ");
b++;
}
printf("%c",ch);
c=1;
if(a>=2)
{
while(c<=2*a-3)
{
printf(" ");
c++;
}
printf("%c",ch);
}
ch=ch+1;
printf("\n");
a++;
}
a=1; ch=ch-2;
while(a<=n-1)
{
b=1;
while(b<=a)
{
printf(" ");
b++;
}
printf("%c",ch);
c=1;
if(a<=n-2)
{
while(c<=2*n-2*a-3)
{
printf(" ");
c++;
}
printf("%c",ch);
}
ch=ch-1;
printf("\n");
a++;
}
return 0;
}
选做 5.6 输出一个字母K吧!
输入一个整数n,输出图形K。如n=4时,输出如下图形。
* *
* *
* *
*
* *
* *
* *
#include
#include
int main()
{
int n,i=1,j;
scanf("%d",&n);
while(i<=n-1)
{
j=1;
printf("*");
while(j<=n-i)
{
printf(" ");
j++;
}
printf("*\n");
i++;
}
printf("*\n");
i=1;
while(i<=n-1)
{
j=1;
printf("*");
while(j<=i)
{
printf(" ");
j++;
}
printf("*\n");
i++;
}
return 0;
}
选做 5.7 输出X图形
输入 n 值,输出下例( n=3 )所示的图形:
* *
* *
*
* *
* *
输入:整数n(例如3)
输出:如上图所示X 形图形
#include
#include
int main()
{
int n,i=1,j,k;
scanf("%d",&n);
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("\n");
i++;
}
i=1;
while(i<=n-1)
{
printf(" ");
i++;
}
printf("*");
i=1;
while(i<=n-1)

{
printf(" ");
i++;
}
printf("\n");
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("\n");
i++;
}
return 0;
}
选做 5.8 输出图形
编程,输入 n 值,输出下例( n=5 )所示的高为 n 的图形 :
#include
#include
int main()
{
int n,i=1,j,k,l;
scanf("%d",&n);
while(i<=n-1)
{
j=1;
while(j<=i)
{
printf("*");
j++;
}
k=1;
while(k<=2*n-2*i-1)
{
printf(" ");
k++;
}
l=1;
while(l<=i)
{
printf("*");
l++;
}
printf("\n");
i++;
}
i=1;
while(i<=2*n-1)
{
printf("*");
i++;
}
printf("\n");
return 0;
}
选做 5.9 画个空心的梯形吧
编程,输入 n ,输出如下例( n=5 )所示的 高和上底均为 n 的等腰空心梯形。
#include
#include

int main()
{
int n,i=1,j,k;
scanf("%d",&n);
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("\n");
i++;
}
return 0;
}
选做 5.10 输出菱形图案
输入 n ,输出如下例( n=3 )所示的菱形:
*
***
*****
***
*
#include
#include
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
for(j=1; j<=n-i; j++)
{
printf(" ");
}
for(k=1; k<=2*i-1; k++)
{
printf("*");
}
printf("\n");
}
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("\n");
}
return 0;
}
5.11 最大公约数
输入两个正整数m和n,求它们的最大公约数和最小公倍数
比如,输入m和n的值分别为14和21,则最大公约数为7,最小公倍数为42


#include
void main()
{
int m,n,i,j;
scanf("%d%d",&m,&n);
for(i=m;i>=1;i--)
{
if (n%i==0&&m%i==0)
{printf("the greatest common divisor is %d\n",i); break;
}
}
for (j=m;;j++)
{
if (j%m==0&&j%n==0)
{printf("the least common multiple is %d\n",j); break;
}
}
}
5.12 水仙花数
输出所有的水仙花数。所谓的水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33
输出语句:printf("%d\n",n);
#include
void main()
{
int n, i, j, k;
for(n=100; n<=999; n=n+1)
{
i = n/100; // 取出n的百位数
j = (n/10)%10; // 取数n的十位数
k = n%10; // 取出n的个位数
if(n==i*i*i+j*j*j+k*k*k)
printf("%d\n",n);
}
}
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("%d",&n);
for(i=1;i{
if(n%i==0)
sum=sum+i;
}
if(n==sum)
{
printf("Yes,its factors are ");
for(c=1; c{
if(n%c==0)
printf(" %d",c);
}
printf("\n");
}
else
printf("No\n");

}
5.14 素数
输入两个正整数m和n,求出[m,n]区间的所有素数
#include
#include
void main()
{int m,n,i,j,k;
scanf("%d%d",&m,&n);
for(i=m;i{k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0)
break;
if(j>k)
printf(" %d",i);
}
printf("\n");
}
5.15 找出最大素数
素数是指一个只能被1和它本身整除的数,在数论中占有重要的研究地位,在当代密码学中也被广泛应用。
输入:取值范围
输出:该范围内的最大素数
#include
int main()
{
int a,i,j;
scanf("%d",&a);
for(i=a;i>1;i--)
{
for(j=2;j{
if(i%j==0)
break;
}
if(j==i)
{
printf("%d\n",i);
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("Yes\n");
}
else printf("No\n");
free(str);
system("pause");
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;
}
*(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("%d",&n);
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("Yes\n");
}
else
{
printf("No\n");
}
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("%d",&n);
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("%d-%d\n",c,b);
}
else
{
printf("No output\n");
}
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("%d %d",&m,&n);
for(a=1; a<=n; a++)
{
b=b*m;
b=b%1000;
}
printf("The last 3 digits of %d ** %d is: %d\n",m,n,b);
return 0;
}
选做 5.20 阶乘尾数零的个数
输入一个正整数n,求其阶乘尾数0的个数。比如,输入n的值为100,则其阶乘尾数0的个数为24。
#include
#include
int main()
{
int n,a,b,c;
scanf("%d",&n);
a=n/25;
b=n/5;
c=a+b;
printf("The number of 0 in the end of %d! is:%d.\n",n,c);
return 0;
}
5.21 看看是谁做的好事
某四位同学中有一个做了好事 , 不留名 , 表扬信来了,校长问是谁做的好事 . 以下四个人中有三个人说的是真话.
A 说 : 不是我
B 说 : 是 C
C 说 : 是 D
D 说 : 他说的不对 !
编写程序:输出是谁做的好事,只输出对应的大写字母,输出格式printf("%c\n",ch); 。
#include
#include
int main()
{
char ch;
for(ch='A'

; ch<='D'; ch++)
{
if(ch=='A'&&ch=='C'&&ch=='D'&&ch!='D')
printf("%c\n",ch);
if(ch!='A'&&ch!='C'&&ch=='D'&&ch!='D')
printf("%c\n",ch);
if(ch!='A'&&ch=='C'&&ch!='D'&&ch!='D')
printf("%c\n",ch);
if(ch!='A'&&ch=='C'&&ch=='D'&&ch=='D')
printf("%c\n",ch);
}
}
5.22 贪吃的猴子
有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。
输入:天数n
输出:第一天的桃子个数,输出语句为printf("The monkey got %d peachs in first day.\n",sum);
Smaple:
Input:
5
Output
The monkey got 114 peachs in first day.
#include
#include
int main()
{
int n,i;
long int m=1;
scanf("%d",&n);
for(i=1; i<=n-1; i++)
{
m=(n-i+m)*2;
}
printf("The monkey got %d peachs in first day.\n",m);
return 0;
}
5.23 百马百担
有100匹马,驮100担货,其中大马驮3担,中马驮2担,两匹小马驮1担
输入:无
输出:大、中、小马的个数,用逗号分隔。例如:2,30,68
说明:大、中、小马都必须有,结果中要列出所有的组合可能每个结果占一行因为有多个结果,结果的排序按照大马的个数从少到多
#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("%d,%d,%d\n",x,y,z);
}
}
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 都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的13日又恰逢星期五就叫 “ 黑色星期五 ” 。输入某年年号和该年的元旦是星期几( 1-7),输出该年所有的 “ 黑色星期五 ” 的日期(年 /月/日) 。
输入: 4位年号和该年元旦是星期几
输出: 所有的 “黑色星期五”的日期(年/月/日)
#include
#include
int main()
{
int y,m,d,x;
scanf("%d %d",&y,&x);
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("%d/%d/%d\n",y,m,d);
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("%d/%d/%d\n",y,m,d);
x++;
if(x==8)
x=1;
}
}
if(((y%4==0&&y%100!=0)||y%400==0)&&m==2)
{
for(d=1; d<=29; d++)
{
if(d==13&&x==5)
printf("%d/%d/%d\n",y,m,d);
x++;
if(x==8)
x=1;
}
}
if(y%4!=0&&m==2)
{
for(d=1; d<=28; d++)
{
if(d==13&&x==5)
printf("%d/%d/%d\n",y,m,d);
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
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("A:是罪犯\n");
if(A==0)
printf("A:不是罪犯\n");
if(B==1)
printf("B:是罪犯\n");
if(B==0)
printf("B:不是罪犯\n");
if(C==1)
printf("C:是罪犯\n");
if(C==0)
printf("C:不是罪犯\n");
if(D==1)
printf("D:是罪犯\n");
if(D==0)
printf("D:不是罪犯\n");
if(E==1)
printf("E:是罪犯\n");
if(E==0)
printf("E:不是罪犯\n");
if(F==1)
printf("F:是罪犯\n");
if(F==0)
printf("F:不是罪犯\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)%100;
if(d!=0)
break;
d=(a*10+b*5+c)/10;
printf("%d,%d,%d,%d\n",c,b,a,d);
}
return 0;
}
选做 5

.28 马戏团观众人数
一个马戏团表演, n 个座位全满,全部门票收入是 120 元,现在知道,男人每人 5 元,女人每人 2 元,小孩每人 1 角。编程,输入总人数 n ,输出满足要求的男人、女人和小孩人数的全部方案。若 n 人无法满足条件,则输出“No output\n”。
输入: 人数 n
输出: 男人、女人和小孩人数
#include
#include
int main()
{
int n,a,b,c;
scanf("%d",&n);
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("%d %d %d\n",a,b,c);
return 0;
}
选做 5.29 爱因斯坦的数学题
爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩一阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶?
输出语句格式为:printf("Stairs number = %d\n",number);
#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("Stairs number = %d\n",number);
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("The license plate is:%d\n",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("%d%d",&m,&n);
for (i=0;i<=n;i++)
{
t=sign*(m+i);
sign=-sign;
s=s+t;
}
printf("s=%d\n",s);
}
5.32 计算SUM的值

已知公式:SUM = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n
输入:n
输出:表达式 sum 的值。结果保留 6 位小数
#include
int main()
{
int i,n;
float s = 0.0, t;
scanf("%d", &n);
for (i=1;i<=n;i++)
{
t=1.0/i;
s+=t;
}
printf("sum=%.6f\n",s);
return 0;
}
5.33 迭代法
用迭代法求.求平方根的迭代公式为:
要求前后两次求出

的x的差的绝对值小于10-5。
#include
#include
int main()
{
double x1,x2,a;
scanf("%lf",&a);
{
x2=1.0;
do
{
x1=x2;
x2=0.5*(x1+a/x1);
}
while(fabs(x2-x1)>=1e-5);
printf("The square root of %.2f is %.5f\n",a,x2);
}
return 0;
}
5.34 分数序列
有一个分数序列:...............,输入整数n,求出其前n项的和。
输出语句格式为:printf("sum=%16.10f\n",s);
#include
int main()
{
int a,b,c,n,i;
double s;
scanf("%d",&n);
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("sum=%16.10f\n",s);
return 0;
}
5.35 求e的值
编写程序,从键盘输入整数 n , 求 e 的值 . e=1+1/1!+1/2!+1/3!+..+1/n! 注意:用 double 型数据计算输出语句:printf("e=%lf\n",e);
#include
int main()
{
double e=1.0,f=1.0;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
f=f/i;
e=e+f;
}
printf("e=%lf\n",e);
}
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("%d", &n);
for (i = 1; i <= n; i ++)
{ t = 1.0 / (sign * i); sign = -sign; s += t; }
printf("sum=%.4f\n", s);
return 0;
}
5.37 cos(x)-x=0
利用以下所示的简单迭代方法求方程: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("x=%f",x);。
#include
#include
int main()
{
double x1,x2;
scanf("%d\n",&x1);
x2=cos(x1);
while(fabs(x2-x1)>0.000001)
{
x1=x2;
x2=cos(x1);
}
printf("x=%f\n",x2);
}
选做 5.38 SIX+SIX+SIX=NINE+NINE
计算出自然数SIX和NINE(它们满足的条件是SIX+SIX+SIX=NINE+NINE)的个数cnt。其中的S,I,X,N,E各代表一个十进制数字。输出语句:printf("cnt=%d\n",cnt);
#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("cnt=%d\n",cnt);
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%10;
a=n/10%10;
r=n%10;
c=101*a+10*r;
b=100*p+10*e+a;
if(n-c==b)
break;
}
printf("pear=%d\n",n);
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 ("%d", &n);
a = sqrt (n);
b = sqrt (n);
for (i = a; i >= 0; i--)
{
for (j = b; j <= n; j++)
{
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 ("%d\n", i);
return 0;
}
选做5.41 求一个三位数,其值等于其各位阶乘之和
编写程序,求某三位数,该数值的大小正好是组成这个数的三个位上的数字阶乘之和。
输出格式:printf("%d\n",num);
#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("%d\n",s1+s2+s3);}
}
选做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("A:%d\n",A+1);
printf("B:%d\n",B+1);
printf("C:%d\n",C+1);
}
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("%d %d %d %d %d\n",a,b,c,d,e);
printf("第一名是B\n第二名是D\n第三名是A\n第四名是E\n第五名是C\n");
}
选做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("%d 号赛车是最佳赛车\n",i);
if(i==2)printf("A说对了");
if(i==4)printf("B说对了");
if(i!=3)printf("C说对了");
if(i!=4) printf("D专家说得对\n");
return 0;
}
选做5.46 求小球弹跳的高度
小球从一定的高度自由落下,每次落地后反跳回原高度的一半;再落下,编写程序,输入一个高度(double类型),求它在第 10 次落地时,共经过多少米?第 10 次反弹多高? (输出结果时保留2位小数)
#include "stdio.h"
void main()
{
double s=0.0,h;
int i;
scanf("%lf",&h);
s=h;
for(i=1;i<10;i++)
{
s=s+h;
h=h/2;
}
h=h/2;
printf("The total is:%.3lf\nThe tenth is:%.3lf\n",s,h);
}
选做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++)
if(w==i) printf("语文课是%c教的\n",c[i]);
for(i=1;i<=3;i++)
if(s==i) printf("算术课是%c教的\n",c[i]);
for(i=1;i<=3;i++)
if(z==i) printf("政治课是%c教的\n",c[i]);
for(i=1;i<=3;i++)
if(d==i) printf("地理课是%c教的\n",c[i]);
for(i=1;i<=3;i++)
if(y==i) printf("音乐课是%c教的\n",c[i]);
for(i=1;i<=3;i++

)
if(m==i) printf("美术课是%c教的\n",c[i]);
}
}
return 0;
}
选做5.48 求各位数字之和等于5且能被5整除的整数
输入正整数 M 和 N(M,N 均小于 10000) ,输出 M 和 N 之间所有满足下列条件的所有整数:整数能被 5 整除且各位数字之和等于 5 。若没有满足条件的整数 , 则输出“No output\n”。
输入: 整数区间 m,n
输出: 各位数字之和等于 5 且能被 5 整除的所有整数
#include"stdio.h"
main()
{int i,m,n,a,b,c,p,k=0,q=1;
scanf("%d %d",&m,&n);
for(i=0;i<=n-m;i++)
{p=m+i;
a=p%10;b=(p%100-a)/10;c=(p%1000-b*10-a)/100;
if(a+b+c==5&&p%5==0)
{printf("%d.%d\n",q,p);q++,k++;};
}
if(k==0) printf("No output\n");
}
选做5.50 分数的四则运算
在小学时我们就学习了分数的四则运算,即对两个分数进行加、减、乘、除等运算,现在我们尝试下用C语言来实现。
输入:分数1 操作符 分数2
输出:计算结果
要求:计算结果使用分数表示,并且为最简化。例如结果为2/6,则被简化为1/3
#include
#include
main()
{
int a,b,c,d,i,x,y;
char op;
scanf("%d/%d%c%d/%d",&b,&a,&op,&d,&c);
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("%d/%d%c%d/%d=0\n",b,a,op,d,c); }
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("%d/%d%c%d/%d=%d\n",b,a,op,d,c,y);
else printf("%d/%d%c%d/%d=%d/%d\n",b,a,op,d,c,y,x);
}
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++)
{
scanf("%d",&a[i]);
}
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("%d\n",i);
}
return 0;
}
6.2 统计素数的个数
求出 2 到 m 之间 ( 含 m,m<=1000) 所有素数并放在数组 a 中。
输入:正整数m
输出:从小到大的所有素数,及个数(素数输出的时候用%4d来控制)
如:
输入:10
输出:2 3 5 7
4
#include
#define M 1000
int main()
{
int a[M]={0};
int i,j,k,n,cnt=0;
scanf("%d",&n);
for(i=2;i<=n;i++)

{
for(j=2;j{ if(i%j==0) break; }
if(i==j) {a[i]=i; cnt++;}
}
for(k=0;kif(a[k]!=0)
printf("%4d",a[k]);
printf("\n%d\n",cnt);
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("%d",&a[i]);
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(" %d",a[i]);
}
printf("\n");
}
6.4 插入法排序
如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。
定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。
#include
int main()
{
int a[11];
int i,j,t,n,m;

for(i=0;i<10;i++)
{scanf("%d",&a[i]);}
scanf("%d",&n);

a[10]=n;
m=a[0];
for(i=1;i<11;i++)
if(m>=a[i])
m=a[i];
printf("%d",m);

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(" %d",a[i]);
}
printf("\n");
return 0;
}
6.5 二维数组
程序定义了 4× 4 的二

维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n 。
例如:数组中的值为
假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即%4d)
#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("%d",&a[i][j]);
scanf("%d",&n);
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("%4d",a[i][j]);
printf("\n");
}
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
#include
#define M 100
int main()
{
int a[M][M];
int i,j,n;
scanf("%d",&n);
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("%3d",a[i][j]);
printf("\n");
}
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("%d",&a[i][j]);
if(i==0||i==3||j==0||j==4)
sum+=a[i][j];
}
printf("%d\n",sum);
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;
scan

相关主题
文本预览
相关文档 最新文档