谭浩强c语言第五章习题
5.3 输入两个正整数m和n,求其最大公约数和最小公倍数。
# include <stdio.h>
# include <math.h>
int main ( )
{
int m, n, i, t, rem, k;
printf ( "Please input two integer m&n:" ) ;
scanf ( "%d%d" , & m, & n) ;
if ( n< m)
{
t= m;
m= n;
n= t;
}
i = m* n;
while ( m!= 0 )
{
rem = n% m;
n = m;
m = rem;
}
printf ( "最大公因数为%d\n" , n) ;
k = i/ n;
printf ( "最小公倍数为%d\n" , k) ;
return 0 ;
}
5.4 输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
# include <stdio.h>
int main ( )
{
char c;
int English= 0 , space = 0 , number = 0 , other = 0 ;
printf ( "请输入一行字符:\n" ) ;
while ( ( c = getchar ( ) ) != '\n' )
{
if ( c>= 'a' && c<= 'z' || c>= 'A' && c<= 'Z' )
English++ ;
else if ( c>= '0' && c<= '9' )
number++ ;
else if ( c== ' ' )
space++ ;
else
other++ ;
}
printf ( "字母数为%d,空格数为%d,数字数为%d,其他为%d\n" , English, space, number, other) ;
return 0 ;
}
5.5 求
S
n
Sn
S n
# include <stdio.h>
# include <math.h>
int main ( )
{
int a, n, i, Sn, temp;
Sn = 0 ;
temp = 0 ;
printf ( "请输入a和位数n:" ) ;
scanf ( "%d%d" , & a, & n) ;
for ( i= 1 ; i<= n; i++ )
{
temp+= a;
Sn+= temp;
a*= 10 ;
}
printf ( "a+aa+...+aa...a=%d" , Sn) ;
return 0 ;
}
5.6 求
∑
n
=
1
20
n
!
\sum_{n=1}^{20}n!
∑ n = 1 20 n !
# include <stdio.h>
# include <math.h>
int main ( )
{
int n, i;
double temp, Sn;
Sn = 0 ;
temp = 1 ;
printf ( "n=" ) ;
scanf ( "%d" , & n) ;
for ( i= 1 ; i<= n; i++ )
{
temp = temp* i;
Sn+= temp;
}
printf ( "求和Sn = %.2f" , Sn) ;
return 0 ;
}
5.7 求
∑
k
=
1
100
k
+
∑
k
=
1
50
k
2
+
∑
k
=
1
10
1
k
\sum_{k=1}^{100}k+\sum_{k=1}^{50}k^2+\sum_{k=1}^{10}\frac{1}{k}
∑ k = 1 100 k + ∑ k = 1 50 k 2 + ∑ k = 1 10 k 1 。
# include <stdio.h>
# include <math.h>
int main ( )
{
int a, b, c, k;
double Sn, temp1, temp2, temp3, m;
Sn = 0.0 ;
temp1 = 0.0 ;
temp2 = 0.0 ;
temp3 = 0.0 ;
printf ( "a,b,c=" ) ;
scanf ( "%d%d%d" , & a, & b, & c) ;
for ( k= 1 ; k<= a; k++ )
{
temp1+= k;
}
for ( k= 1 ; k<= b; k++ )
{
m = k* k;
temp2+= m;
}
for ( k= 1 ; k<= c; k++ )
{
temp3+= 1.0 / k;
}
Sn = temp1+ temp2+ temp3;
printf ( "%.5f" , Sn) ;
return 0 ;
}
5.8 输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。
# include <stdio.h>
# include <math.h>
int main ( )
{
int i, m, j, k, n;
n= 0 ;
for ( i= 100 ; i<= 999 ; i++ )
{
m = i/ 100 ;
j = ( i- m* 100 ) / 10 ;
k = i- m* 100 - j* 10 ;
if ( i== m* m* m+ j* j* j+ k* k* k)
{
printf ( "%d\t" , i) ;
n++ ;
if ( n% 2 == 0 )
printf ( "\n" ) ;
}
else continue ;
}
return 0 ;
}
5.9 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:
# include <stdio.h>
# include <math.h>
int main ( )
{
int m, sum, i;
for ( m= 1 ; m< 1000 ; m++ )
{
sum = 0 ;
for ( i= 1 ; i< m; i++ )
{
if ( m% i== 0 )
sum+= i;
}
if ( m== sum)
{
printf ( "%d,its factors are " , m) ;
for ( i= 1 ; i< m; i++ )
{
if ( m% i== 0 )
printf ( "%d " , i) ;
}
printf ( "\n" ) ;
}
}
return 0 ;
}
5.10 有一个分数序列,
2
1
,
3
2
,
5
3
,
13
8
,
21
13
,
⋯
\frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{13}{8},\frac{21}{13},\cdots
1 2 , 2 3 , 3 5 , 8 13 , 13 21 , ⋯ 求出这个数列的前20项之和。
# include <stdio.h>
# include <math.h>
int main ( )
{
int i, n;
double sum, m, j, k;
sum = 0.0 ;
printf ( "请输入项数n=" ) ;
scanf ( "%d" , & n) ;
j= 2.0 ; k= 1.0 ;
for ( i= 1 ; i<= n; i++ )
{
sum+= j/ k;
m = j;
j+= k;
k = m;
}
printf ( "sum=%.8f" , sum) ;
return 0 ;
}
5.11 一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
# include <stdio.h>
# include <math.h>
int main ( )
{
int i, n;
double temp, sum= 0.0 , H= 100 ;
printf ( "please input n=" ) ;
scanf ( "%d" , & n) ;
for ( i= 1 ; i<= n; i++ )
{
temp = H/ 2.0 ;
sum = sum+ 2.0 * temp;
H= H/ 2.0 ;
}
sum = sum+ 100 ;
printf ( "%.5f\n" , sum) ;
printf ( "%.5f" , temp) ;
return 0 ;
}
5.12 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
# include <stdio.h>
# include <math.h>
int main ( )
{
int i, m= 1 , sum;
for ( i= 1 ; i< 10 ; i++ )
{
m = ( m+ 1 ) * 2 ;
sum = m;
}
printf ( "%d\n" , sum) ;
return 0 ;
}
5.13 用迭代法求
x
=
a
x = \sqrt{a}
x = a
。求平方根的迭代公式为
x
n
+
1
=
1
2
(
x
n
+
a
x
n
)
x_{n+1} = \frac{1}{2}(x_n+\frac{a}{x_n})
x n + 1 = 2 1 ( x n + x n a ) ,要求前后两次求出的x的差的绝对值小于
1
0
−
5
10^{-5}
1 0 − 5 。
# include <stdio.h>
# include <math.h>
int main ( )
{
float a, x0, x1;
printf ( "Input positive a:" ) ;
scanf ( "%f" , & a) ;
x0= a/ 2 ;
x1= ( x0+ a/ x0) / 2 ;
do
{
x0= x1;
x1= ( x0+ a/ x0) / 2 ;
}
while ( fabs ( x0- x1) > 1e-5 ) ;
printf ( "sqrt(%f)=%f 标准sqrt(%f)=%f\n" , a, x1, a, sqrt ( a) ) ;
}
5.16 输出以下图案:
# include <stdio.h>
int main ( )
{
int i, j, k;
for ( i= 0 ; i<= 3 ; i++ )
{
for ( j= 0 ; j<= 2 - i; j++ )
printf ( " " ) ;
for ( k= 0 ; k<= 2 * i; k++ )
printf ( "*" ) ;
printf ( "\n" ) ;
}
for ( i= 0 ; i<= 2 ; i++ )
{
for ( j= 0 ; j<= i; j++ )
printf ( " " ) ;
for ( k= 0 ; k<= 4 - 2 * i; k++ )
printf ( "*" ) ;
printf ( "\n" ) ;
}
return 0 ;
}
5.17 两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。
# include <stdio.h>
int main ( )
{
char m, n, k;
for ( m= 'X' ; m<= 'Z' ; m++ )
{
for ( n= 'X' ; n<= 'Z' ; n++ )
if ( m!= n)
{
for ( k= 'X' ; k<= 'Z' ; k++ )
if ( m!= k&& n!= k)
if ( m!= 'X' && k!= 'X' && k!= 'Z' )
printf ( " A--%c\n B--%c\n C--%c\n" , m, n, k) ;
}
}
return 0 ;
}