利用以下所示的简单迭代方法求方程: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
选做 5.38 SIX+SIX+SIX=NINE+NINE
计算出自然数SIX和NINE(它们满足的条件是SIX+SIX+SIX=NINE+NINE)的个数cnt。其中的S,I,X,N,E各代表一个十进制数字。输出语句:printf(\ #include
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
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
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 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
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
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 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 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
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
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
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 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 -