概述
6.1 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
答案:
#include <stdio.h>
main()
{
int m,n,com_div=1,com_mul,i;
scanf("%d%d",&m,&n);
for(i=2;i<=m&&i<=n;i++)
if(m%i0&&n%i0)
com_div=i;
com_mul=m*n/com_div;
printf("%d,%d",com_div,com_mul);
}
6.2 输入一行字符,分别统计出其中英文字母、数字空格、数字和其他字符的个数。
答案
#include <stdio.h>
main()
{
char c;
int i=0,j=0,k=0,l=0;
while((c=getchar())!=’n’)
{
if(c>=65&&c<=90||c>=97&&c<=122)
i++;
else if(c==32)
j++;
else if(c>=48&&c<=57)
k++;
else l++;
}
printf(“letter is %d,space is %d, number is %d, other is %d”,i,j,k,l);
}
评论:
while((c=getchar())!=’n’)这个句子里c=getchar()要在外头加一个括号,否则会出错;
注意区分while和for语句的用法,格式
6.3 求 Sn=a+aa+aaa+ … +aa … aaa ( 有 n 个 a ) 之 值 , 其 中 a 是 一 个 数 字 。 例 如 :
2+22+222+2222+22222(n=5),n 由键盘输入。
答案:
#include <stdio.h>
#include <math.h>
main()
{
int Sn,s=0,a,n,i,j;
scanf("%d%d",&a,&n);
for(i=1;i<=n;i++)
{
s+=pow(10,i-1)*a;
Sn+=s;
}
printf("%d",Sn);
}
6.4 求 ,(即求 1!+2!+3!+4!+5!+…+20!)
答案:
#include <stdio.h>
main()
{
int i,j,n,s=1,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s*=i;
sum+=s;
}
printf(“sum=%d”,sum);
}
6.5 求
答案:
#include <stdio.h>
main()
{
float k;
float sum=0;
for(k=1;k<=100;k++)
sum+=k;
for(k=1;k<=50;k++)
sum+=k*k;
for(k=1;k<=10;k++)
sum+=1/k;
printf(“sum=%f”,sum);
}
6.6 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153 是一个水仙花数,因为 153=13+53+3^3。
答案:
#include <stdio.h>
main()
{
int i,j,s,u,v,w;
for(i=100;i<=999;i++)
{
u=i/100;
v=(i-100u)/10;
w=i-100u-10v;
if(i==uuu+vvv+ww*w)
printf("%d ",i);
}
}
6.7 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6 的因子为 1、2、3,而 6=1+2+3,因此 6 是"完数"。编程序找出 1000 之内的所有完数,并按下面格式输出其因子:
6 its factors are 1、2、3
答案:
#include <stdio.h>
main()
{
int i,j,s=1;
for(i=2;i<1000;i++)
{
s=1;
for(j=2;j<i;j++)
if(i%j0)
s+=j;
if(si)
{
printf("%d its factors are 1",s);
for(j=2;j<i;j++)
if(i%j==0)
printf(",%d",j);
printf("n");
}
}
}
6.8 有一分数序列:
2/1,3/2,5/3,8/5,13/8,21/13,……
求出这个数列的前 20 项之和。
答案:
#include <stdio.h>
main()
{
float i,m=2,t,n=1,s=2;
for(i=2;i<=20;i++)
{
t=m;
m+=n;
n=t;
s+=m/n;
}
printf("%f",s);
}
6.9 一球从 100 米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第 10 次落 地时共经过多少米?第 10 次反弹多高?
答案:
#include <stdio.h>
int main()
{
float height=100,n,sum=100;
for(n=2;n<=10;n++)
{
height/=2;
sum+=height*2;
}
height/=2;
printf("%f,%f",height,sum);
}
6.10 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半 零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
答案:
#include <stdio.h>
int main()
{
int a=1,i;
for(i=2;i<=10;i++)
a=2*(a+1);
printf("%d",a);
}
6.11 用迭代法求
求平方根的迭代公式为:
求前后两次求出的得差的绝对值少于 0.00001。
答案:
#include <stdio.h>
#include <math.h>
int main()
{
double a,x1,x2;
scanf("%lf",&a);
x1=a/2;
for(;;)
{
x2=(x1+a/x1)/2;
if(fabs(x2-x1)<0.00001)
break;
else x1=x2;
}
printf("%f",x2);
}
用 do-while结构
#include <stdio.h>
#include <math.h>
int main()
{
double a,x1,x2;
scanf("%lf",&a);
x2=a;
do
{
x1=x2;
x2=(x1+a/x1)/2;
}
while(fabs(x2-x1)>=0.00001);
printf("%f",x2);
}
评论:
初值不影响迭代结果
这个是数学问题;
printf输出float和double都可以用%f,double还可以用%lf, 2 scanf输入float用%f,double输入用%lf,不能混用;abs和fabs,abs是整数取绝对值,而fabs是指浮点数取绝对值。
6.12 用牛顿迭代法求方程在 1.5 附近的根。
牛顿迭代公式:
答案:
#include <stdio.h>
#include <math.h>
int main()
{
double x1,x2;
x2=1.5;
do
{
x1=x2;
x2=x1-(2x1x1x1-4x1x1+3x1-6)/(6x1x1-8*x1+3);
}
while(fabs(x2-x1)>=0.000001);
printf(“The root is %.3f”,x2);
}
评论:
注意循环的条件,设反了就。。。
6.13 用二分法求6.12的方程在(-10,10)之间的根
#include <stdio.h>
#include <math.h>
double fx(double x)
{
double fx;
fx=2xxx-4xx+3x-6;
return fx;
}
int main()
{
double x1=-10,x2=10,x;
do{
x=(x1+x2)/2;
if(fx(x)*fx(x1)<=0)
x2=x;
else if(fx(x)*fx(x1)>0)
x1=x;
}
while(fabs(x2-x1)>=0.000001);
printf(“The root is %f”,x);
}
6.14 打印以下图案
*
***
*****
*****
***
*
#include <stdio.h>
int main()
{
int i,j,n;
printf(“input a numbern”);
scanf("%d",&n);
for(i=1;i<=n/2+1;i++)
{
for(j=1;j<=(n+1)/2-i;j++)
printf(" “);
for(j=(n+3)/2-i;j<=n/2+i;j++)
printf(”");
printf("n");
}
for(i=1;i<n/2+1;i++)
{
for(j=1;j<=i;j++)
printf(" “);
for(j>=i+1;j<=n-i;j++)
printf(”");
printf("n");
}
}
6.15两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#include <stdio.h>
int main()
{
int i,j,k;
for(i=‘x’;i<=‘z’;i++)
for(j=‘x’;j<=‘z’;j++)
{
if(i!=j)
for(k=‘x’;k<=‘z’;k++)
if(k!=i&&k!=j)
if(i!=‘x’&&k!=‘x’&&k!=‘z’)
printf(“a-%cnb-%cnc-%c”, i, j, k);
}
}
评论:
此题用了穷举法,涉及到字符总是有点难以理解。
7.1 用筛法求100之内的素数。
#include <stdio.h>
int main()
{
int i,j,a[100];
for(i=2;i<100;i++)
a[i]=i;
for(i=2;i<100;i++)
{
for(j=2;j<=i;j++)
{
if(a[i]%j0)
break;
}
if(ji)
printf("%d, ",a[i]);
}
}
7.2用选择法对10个整数从小到大排序。
#include <stdio.h>
int main()
{
int i,j,a[10],temp;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
7.3求一个3×3矩阵对角线元素之和。
#include <stdio.h>
int main()
{
int i,j,a[3][3],sum1,sum2;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
sum1=a[1][1]+a[2][2]+a[0][0];
sum2=a[0][2]+a[1][1]+a[2][0];
printf(“sum1=%d,sum2=%dn”,sum1,sum2);
}
评论:
注意矩阵的对角线有两条啊,吐血。。。
另,将题目中的三阶矩阵,改为n阶矩阵,n由用户输入,程序变复杂很多。其中定义元素数目变化的数组部分,还不是很明白,需要再多看看
#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
int main() {
int a; //用二级指针动态申请二维数组
int i,j;
int n;
int sum1=0,sum2=0;
printf(“请输入阶数n”);
scanf("%d",&n);
a=(int)malloc(sizeof(int*)n);
for(i=0;i<n;i++)
a[i]=(int)malloc(sizeof(int)n);
printf(“请输入元素n”);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{sum1+=a[i][i];
sum2+=a[i][n-i-1];
}
printf(“sum1=%d,sum2=%dn”,sum1,sum2);
for(i=0;i<n;i++)
free(a[i]);
free(a);
return 0;
}
7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。
#include <stdio.h>
int main()
{ int a[10]={1,7,8,17,23,24,59,62,101};
int i,j,t;
scanf("%d",&a[9]);
t=a[9];
if((a[9]-a[8])(a[8]-a[7])<0)
{
if((a[9]-a[0])(a[0]-a[1])>=0)
{
for(j=9;j>0;j–)
a[j]=a[j-1];
a[0]=t;
}
else
for(i=7;i>=0;i–)
if((a[9]-a[i])(a[i]-a[i-1])>=0)
{
for(j=9;j>i+1;j–)
a[j]=a[j-1];
a[i+1]=t;
break;
}
}
for(i=0;i<10;i++)
printf("%d “,a[i]);
}
评论:这串数字是事先输入进去的,但是在后续解题的思路还是假定不知道是从大到小还是从小到大排的。因此程序比较冗余。下面是参考别人的程序,下面两个程序都是按照已知数组排列顺序来进行的。
#include <stdio.h>
main()
{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t;
scanf(”%d",&a[9]);
for(i=9;i>0;i–)
if(a[i]<a[i-1])
{t=a[i-1];a[i-1]=a[i];a[i]=t;}
for(i=0;i<10;i++)
printf("%5d",a[i]);printf("n");
}
或者
#include <stdio.h>
main()
{
static int a[5]={1,4,5,6,7};
int i,t,b;
scanf("%d",&b);
for(i=0;i<5;i++)
{if(b<=a[i])
{t=a[i];a[i]=b;b=t;}
printf("%d “,a[i]);}
printf(”%d",b);
}
7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。
#include <stdio.h>
int main()
{
int a[5]={8,6,5,4,1},i,t,n=5;
for(i=0;i<=n/2;i++)
{
t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
for(i=0;i<5;i++)
printf("%d ",a[i]);
}
7.6打印出以下杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
:
:
答案:
#include <stdio.h>
int main()
{int i,j,t;
int a[10][10]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};
for(i=1;i<10;i++)
for(j=1;j<10;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%d “,a[i][j]);
printf(”n");
}
}
7.7 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印出由1~n2的自然数构成的魔方阵。
此题关键是找到魔方阵的组成规律,这个点还没有透彻理解,暂且跳过,可以参考以下链接。http://blog.chinaunix.net/uid-25799257-id-3980262.html?tdsourcetag=s_pcqq_aiomsg
7.8找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
#include <stdio.h>
main()
{ int a[5][5],i,j=0,t[5][5]={},max,c,d,q,s;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
for(i=0;i<5;i++)
{
max=a[i][0];
for(j=0;j<5;j++)
{
if(a[i][j]>=max)
{max=a[i][j];
c=j;
}
}
t[i][c]=a[i][c];
d=i;
s=0;
for(q=0;q<5;q++)
if(a[q][c]>=t[d][c])
s++;
if(s==5)
printf("%dn",t[d][c]);
}
}
7.9有15个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则打印出"无此数" 。
#include <stdio.h>
main()
{
int a[15],i,num;
for(i=0;i<15;i++)
scanf("%d",&a[i]);
scanf("%d",&num);
if(num<a[8])
{
for(i=0;i<9;i++)
if(num==a[i])
{printf(“num is the %d number”,i+1);
break;
}
if(i==9)
printf("num is not in the array");
}
else if(num==a[8])
printf("num is the 9 number");
else if(num>a[8]&&num<=a[14])
{
for(i=9;i<16;i++)
if(numa[i])
{
printf(“num is the %d number”,i+1);
break;}
if(i15)
printf(“num is not in the array”);
}
else
printf("num is not in the array");
}
程序写的非常冗长,对于是否用对了折半法也比较疑惑。
参考一下一份答案如下
#include <stdio.h>
#include"math.h"
main()
{
int a[15],i,j,m;
for(i=0;i<15;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
i=7;
while(fabs(i-7)<8)
{
if(m<a[7])
{
if(a[i]-m0)
{
printf(“it is at (%d)n”,i+1);
break;
}
i–;
}
else if(m>a[7])
{
if(a[i]-m0)
{
printf(“it is at (%d)n”,i+1);
break;
}
i++;
}
else
printf(“8/n”);
}
if(fabs(i-7)-8==0)
printf(“There is notn”);
}
**7.10有一篇文章,共有3行文字,每行有个80字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。 **
#include <stdio.h>
main()
{
char a[3][80];
int i=0,j=0,o=0,p=0,q=0,r=0,s=0;
for(i=0;i<3;i++)
for(j=0;j<80;j++)
scanf("%c",&a[i][j]);
for(i=0;i<3;i++)
for(j=0;j<80;j++)
{
if(a[i][j]>=65&&a[i][j]<=90)
o++;
else if(a[i][j]>=97&&a[i][j]<=122)
p++;
else if(a[i][j]>=48&&a[i][j]<=57)
q++;
else if(a[i][j]==32)
r++;
else
s++;
}
printf(“capital letter is %dnlower case letter is %dnnumber is %dnblank is %dnother is %dn”,o,p,q,r,s);
}
7.11打印以下图案
11111
11111
11111
11111
11111
其中1代表。*
#include <stdio.h>
main()
{int a[10],i,j,k;
for(i=0;i<5;i++)
{
for(k=0;k<i;k++)
printf(" “);
for(j=0;j<5;j++)
printf(”");
printf("n");
}
}
上面解答实际上完全没有用到数组,下面是参考答案。
#include <stdio.h>
main()
{int i,j,k;char a[5][5];
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
{a[i][j]=’’;printf("%c",a[i][j]);}
printf("n");
for(k=1;k<=i+1;k++)
printf("40");}
printf("n");
}
7.12有一行电文译文下面规律译成密码:
A->Z a->z
B->Y b->y
C->X c->x
…
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变,要求编程序将密码回原文,并打印出密码和原文。
#include <stdio.h>
main()
{char a[20],b[20];
int i;
gets(a);
for(i=0;i<20;i++)
if(a[i]>=65&&a[i]<=90)
b[i]=26-(a[i]-64)+1+64;
else if(a[i]>=97&&a[i]<=122)
b[i]=26-(a[i]-96)+1+96;
else
b[i]=a[i];
printf("%sn%sn",a,b);
}
看清楚要求,非字母字符不变。
7.13编一程序,将两个字符串连接起来,不要strcat函数。
#include <stdio.h>
main()
{char a[100],b[100],c[200];
int i=0,j=0;
gets(a);
gets(b);
while(a[i]!=0)
{
c[i]=a[i];
i++;
}
while(b[j]!=0)
{
c[i]=b[j];
i++;j++;
}
puts©;
}
**7.14编一个程序,将两个字符串S1和S2比较,如果S1>S2,输出一个正数;S1=S2,输出0;S1<S2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负数,由于’A’与’C’的码差值为2,因此应输出"-2"。同理:“And"和"Aid"比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出"5”。 **
#include <stdio.h>
main()
{ char S1[100],S2[100];
int i,d;
gets(S1);
gets(S2);
d=0;
for(i=0;S1[i]!=0;i++)
if(S1[i]-S2[i]!=0){
d=S1[i]-S2[i];
break;
}
printf("%d",d);
}
7.15 编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不用strcpy函数。拷贝时,’ ’也要拷贝过去,’ ’后面的字符不拷贝。
#include <stdio.h>
#include <string.h>
main()
{ int i;
char s1[100],s2[100];
printf("n Input string2:");
gets(s2);
for(i=0;i<strlen(s2);i++)
s1[i]=s2[i];
puts(s2);
}
8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
最后
以上就是等待春天为你收集整理的C程序设计-谭浩强老师版本-课后习题第六章至第的全部内容,希望文章能够帮你解决C程序设计-谭浩强老师版本-课后习题第六章至第所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复