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",unit s,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
{
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 四位数拆分
输入一个四位数,判断千位、百位、十位和个位数字之和是否为偶数,如果是,输出Y es,如果不是,输出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+b printf("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(a y=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;i putchar('\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