第二章
练习2-1 Programming in C is fun!
# include <stdio.h>
int main ( )
{
puts ( "Programming in C is fun!" ) ;
return 0 ;
}
练习2-3 输出倒三角图案
# include <stdio.h>
int main ( )
{
puts ( "* * * *" ) ;
puts ( " * * *" ) ;
puts ( " * *" ) ;
printf ( " *" ) ;
return 0 ;
}
练习2-4 温度转换
# include <stdio.h>
int main ( )
{
double F= 150 ;
double C= ( 5.0 / 9 ) * ( F- 32 ) ;
printf ( "fahr = 150, celsius = %d\n" , ( int ) C) ;
return 0 ;
}
练习2-6 计算物体自由下落的距离
# include <stdio.h>
int main ( )
{
double ans= 10 * 3 * 3 / 2 ;
printf ( "height = %.2lf\n" , ans) ;
}
练习2-8 计算摄氏温度
# include <stdio.h>
int main ( )
{
int x;
scanf ( "%d" , & x) ;
printf ( "Celsius = %d\n" , ( int ) 5.0 * ( x- 32 ) / 9 ) ;
return 0 ;
}
练习2-9 整数四则运算
# include <stdio.h>
# include <math.h>
int main ( )
{
int a, b;
scanf ( "%d%d" , & a, & b) ;
printf ( "%d + %d = %d\n" , a, b, a+ b) ;
printf ( "%d - %d = %d\n" , a, b, a- b) ;
printf ( "%d * %d = %d\n" , a, b, a* b) ;
printf ( "%d / %d = %d\n" , a, b, a/ b) ;
return 0 ;
}
练习2-10 计算分段函数[1]
# include <stdio.h>
int main ( )
{
double x;
scanf ( "%lf" , & x) ;
double ans= x== 0 ? 0 : 1 / x;
printf ( "f(%.1lf) = %.1lf\n" , x, ans) ;
return 0 ;
}
练习2-11 计算分段函数[2]
# include <stdio.h>
# include <math.h>
int main ( )
{
double x;
scanf ( "%lf" , & x) ;
printf ( "f(%.2lf) = %.2lf\n" , x, x>= 0 ? pow ( x, 0.5 ) : ( x+ 1 ) * ( x+ 1 ) + 2 * x+ 1 / x) ;
return 0 ;
}
练习2-13 求N分之一序列前N项和
# include <stdio.h>
int main ( )
{
int x;
scanf ( "%d" , & x) ;
double sum= 0 ;
for ( int i= 1 ; i<= x; i++ ) sum+= 1.0 / i;
printf ( "sum = %.6lf\n" , sum) ;
return 0 ;
}
练习2-14 求奇数分之一序列前N项和
# include <stdio.h>
int main ( )
{
int x;
scanf ( "%d" , & x) ;
double sum= 0 ;
for ( int i= 1 ; i<= x; i++ ) sum+= 1.0 / ( 2 * i- 1 ) ;
printf ( "sum = %.6lf\n" , sum) ;
return 0 ;
}
练习2-15 求简单交错序列前N项和
# include <stdio.h>
int main ( )
{
int x;
scanf ( "%d" , & x) ;
double sum= 0 , flag= 1 ;
for ( int i= 1 ; i<= x; i++ )
{
sum+= flag/ ( 3 * ( i- 1 ) + 1 ) ;
flag*= - 1 ;
}
printf ( "sum = %.3lf\n" , sum) ;
return 0 ;
}
练习2-17 生成3的乘方表
# include <stdio.h>
int main ( )
{
int n, m;
scanf ( "%d" , & n) ;
long long p= 1 ;
for ( int i= 0 ; i<= n; i++ )
{
printf ( "pow(3,%d) = %lld\n" , i, p) ;
p*= 3 ;
}
return 0 ;
}
练习2-18 求组合数
# include <stdio.h>
# include <math.h>
double fact ( int x)
{
double ans= 1 ;
for ( int i= 1 ; i<= x; i++ ) ans*= i;
return ans;
}
int main ( )
{
int n, m;
scanf ( "%d%d" , & m, & n) ;
printf ( "result = %.0lf\n" , fact ( n) / ( fact ( m) * fact ( n- m) ) ) ;
return 0 ;
}
习题2-1 求整数均值
# include <stdio.h>
int main ( )
{
int sum= 0 ;
for ( int i= 1 ; i<= 4 ; i++ )
{
int x;
scanf ( "%d" , & x) ;
sum+= x;
}
printf ( "Sum = %d; Average = %.1f\n" , sum, sum/ 4.0 ) ;
return 0 ;
}
习题2-2 阶梯电价
# include <stdio.h>
# include <math.h>
int main ( )
{
int x;
scanf ( "%d" , & x) ;
if ( x< 0 )
{
puts ( "Invalid Value!" ) ;
return 0 ;
}
printf ( "cost = %.2lf\n" , x<= 50 ? 1.0 * x* 0.53 : 0.53 * 50 + 1.0 * ( x- 50 ) * 0.58 ) ;
return 0 ;
}
习题2-3 求平方与倒数序列的部分和
# include <stdio.h>
int main ( )
{
int n, m;
double sum= 0 , flag= 1 ;
scanf ( "%d%d" , & m, & n) ;
for ( int i= m; i<= n; i++ ) sum+= i* i+ 1.0 / i;
printf ( "sum = %.6lf\n" , sum) ;
return 0 ;
}
习题2-4 求交错序列前N项和
# include <stdio.h>
int main ( )
{
int n;
double sum= 0 , flag= 1 ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ ) sum+= flag* i/ ( 2 * i- 1 ) , flag*= - 1 ;
printf ( "%.3lf\n" , sum) ;
return 0 ;
}
习题2-5 求平方根序列前N项和
# include <stdio.h>
# include <math.h>
int main ( )
{
int n, m;
scanf ( "%d" , & n) ;
double sum= 0 ;
for ( int i= 1 ; i<= n; i++ )
{
sum+= sqrt ( i) ;
}
printf ( "sum = %.2lf\n" , sum) ;
return 0 ;
}
习题2-6 求阶乘序列前N项和
# include <stdio.h>
# include <math.h>
int main ( )
{
int n, m;
scanf ( "%d" , & n) ;
int ans= 0 , sum= 1 ;
for ( int i= 1 ; i<= n; i++ ) sum*= i, ans+= sum;
printf ( "%d\n" , ans) ;
return 0 ;
}
第三章
练习3-2 计算符号函数的值
# include <stdio.h>
# include <math.h>
int main ( )
{
int n, m;
scanf ( "%d" , & n) ;
if ( n> 0 ) printf ( "sign(%d) = 1\n" , n) ;
if ( n== 0 ) printf ( "sign(%d) = 0\n" , n) ;
if ( n< 0 ) printf ( "sign(%d) = -1\n" , n) ;
return 0 ;
}
练习3-3 统计学生平均成绩与及格人数
# include <stdio.h>
int main ( )
{
int sum= 0 , tot= 0 , n;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
{
int x;
scanf ( "%d" , & x) ;
sum+= x;
tot+= ( x>= 60 ) ;
}
printf ( "average = %.1lf\ncount = %d" , n== 0 ? 0.0 : 1.0 * sum/ n, tot) ;
return 0 ;
}
练习3-4 统计字符
# include <stdio.h>
# include <math.h>
int main ( )
{
int ans1= 0 , ans2= 0 , ans3= 0 , ans4= 0 ;
for ( int i= 1 ; i<= 10 ; i++ )
{
char c= getchar ( ) ;
if ( c== ' ' || c== '\n' || c== '\r' ) ans2++ ;
else if ( ( c>= 'a' && c<= 'z' ) || ( c>= 'A' && c<= 'Z' ) ) ans1++ ;
else if ( c>= '0' && c<= '9' ) ans3++ ;
else ans4++ ;
}
printf ( "letter = %d, blank = %d, digit = %d, other = %d\n" , ans1, ans2, ans3, ans4) ;
return 0 ;
}
练习3-5 输出闰年
# include <stdio.h>
int main ( )
{
int n, flag= 0 ;
scanf ( "%d" , & n) ;
if ( n< 2001 || n> 2100 )
{
puts ( "Invalid year!" ) ;
return 0 ;
}
for ( int i= 2001 ; i<= n; i++ )
{
int x= i;
if ( ( x% 4 == 0 && x% 100 ) || ( x% 400 == 0 ) ) printf ( "%d\n" , x) , flag= 1 ;
}
if ( ! flag) puts ( "None" ) ;
return 0 ;
}
练习3-7 成绩转换
# include <stdio.h>
int main ( )
{
int n, flag= 0 ;
scanf ( "%d" , & n) ;
if ( n>= 90 )
{
puts ( "A" ) ;
return 0 ;
}
if ( n>= 80 )
{
puts ( "B" ) ;
return 0 ;
}
if ( n>= 70 )
{
puts ( "C" ) ;
return 0 ;
}
if ( n>= 60 )
{
puts ( "D" ) ;
return 0 ;
}
puts ( "E" ) ;
return 0 ;
}
练习3-8 查询水果价格
# include <stdio.h>
int main ( )
{
puts ( "[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit" ) ;
for ( int i= 1 ; i<= 5 ; i++ )
{
int x;
scanf ( "%d" , & x) ;
if ( ! x) break ;
if ( x== 1 ) printf ( "price = 3.00\n" ) ;
else if ( x== 2 ) printf ( "price = 2.50\n" ) ;
else if ( x== 3 ) printf ( "price = 4.10\n" ) ;
else if ( x== 4 ) printf ( "price = 10.20\n" ) ;
else printf ( "price = 0.00\n" ) ;
}
return 0 ;
}
习题3-1 比较大小
# include <stdio.h>
# include <math.h>
void swap ( int * x, int * y)
{
int tmp= ( * x) ;
* x= ( * y) , ( * y) = tmp;
}
int main ( )
{
int a, b, c;
scanf ( "%d%d%d" , & a, & b, & c) ;
if ( a> b) swap ( & a, & b) ;
if ( a> c) swap ( & a, & c) ;
if ( b> c) swap ( & b, & c) ;
printf ( "%d->%d->%d\n" , a, b, c) ;
return 0 ;
}
习题3-2 高速公路超速处罚
# include <stdio.h>
int main ( )
{
int a, b;
scanf ( "%d%d" , & a, & b) ;
if ( ( a- b) * 10 < b) puts ( "OK" ) ;
else if ( ( a- b) * 2 < b) printf ( "Exceed %.0lf%%. Ticket 200\n" , ( a- b) * 100.0 / b) ;
else printf ( "Exceed %.0lf%%. License Revoked\n" , ( a- b) * 100.0 / b) ;
return 0 ;
}
习题3-3 出租车计价
# include <stdio.h>
int main ( )
{
double mile= 0 ;
int time= 0 ;
double price, price1, price2;
scanf ( "%lf%d" , & mile, & time) ;
if ( mile<= 3 ) price1= 10 ;
else if ( mile<= 10 ) price1= 10 + ( mile- 3 ) * 2.0 ;
else price1= 10 + ( 10 - 3 ) * 2.0 + ( mile- 10 ) * 3.0 ;
price2= time/ 5 * 2 ;
price= price1+ price2;
printf ( "%.0f\n" , price) ;
return 0 ;
}
习题3-4 统计学生成绩
# include <stdio.h>
int main ( )
{
int n;
scanf ( "%d" , & n) ;
int A= 0 , B= 0 , C= 0 , D= 0 , E= 0 ;
for ( int i= 1 ; i<= n; i++ )
{
int x;
scanf ( "%d" , & x) ;
A+= ( x>= 90 ) ;
B+= ( ( x>= 80 ) && ( x< 90 ) ) ;
C+= ( ( x>= 70 ) && ( x< 80 ) ) ;
D+= ( ( x>= 60 ) && ( x< 70 ) ) ;
E+= ( x< 60 ) ;
}
printf ( "%d %d %d %d %d\n" , A, B, C, D, E) ;
return 0 ;
}
习题3-5 三角形判断
# include <stdio.h>
# include <math.h>
int main ( )
{
double x1, y1, x2, y2, x3, y3;
scanf ( "%lf%lf%lf%lf%lf%lf" , & x1, & y1, & x2, & y2, & x3, & y3) ;
double len1= sqrt ( ( x1- x2) * ( x1- x2) + ( y1- y2) * ( y1- y2) ) ;
double len2= sqrt ( ( x1- x3) * ( x1- x3) + ( y1- y3) * ( y1- y3) ) ;
double len3= sqrt ( ( x3- x2) * ( x3- x2) + ( y3- y2) * ( y3- y2) ) ;
if ( len1> len2)
{
double tmp= len2;
len2= len1, len1= tmp;
}
if ( len1> len3)
{
double tmp= len3;
len3= len1, len1= tmp;
}
if ( len2> len3)
{
double tmp= len3;
len3= len2, len2= tmp;
}
double s= ( len1+ len2+ len3) / 2 ;
if ( len1+ len2<= len3) puts ( "Impossible" ) ;
else printf ( "L = %.2lf, A = %.2lf\n" , len1+ len2+ len3, sqrt ( s* ( s- len1) * ( s- len2) * ( s- len3) ) ) ;
return 0 ;
}
第四章
练习4-3 求给定精度的简单交错序列部分和
# include <stdio.h>
# include <math.h>
int main ( )
{
double exp;
scanf ( "%lf" , & exp) ;
int i, l= 1 ;
double sum= 0 , t;
for ( i= 1 ; ; i+= 3 )
{
t= 1.0 / i* l;
sum+= t;
if ( fabs ( t) <= exp) break ;
l= - l;
}
printf ( "sum = %.6lf\n" , sum) ;
return 0 ;
}
练习4-6 猜数字游戏
# include <stdio.h>
int main ( )
{
int num, n;
scanf ( "%d%d" , & num, & n) ;
int pn, count= 0 ;
for ( int i= 1 ; i<= n; i++ )
{
scanf ( "%d" , & pn) ;
count++ ;
if ( count== 1 && pn== num)
{
printf ( "Bingo!" ) ;
break ;
}
else if ( count<= 3 && count> 1 && pn== num)
{
printf ( "Lucky You!" ) ;
break ;
}
else
{
if ( pn< 0 )
{
printf ( "Game Over" ) ;
break ;
}
if ( pn> num) printf ( "Too big\n" ) ;
if ( pn< num) printf ( "Too small\n" ) ;
if ( pn == num) printf ( "Good Guess!" ) ;
}
}
if ( pn!= num&& count== n) printf ( "Game Over" ) ;
return 0 ;
}
练习4-7 求e的近似值
# include <stdio.h>
int main ( )
{
int n;
double ans= 1 , tmp= 1 ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
tmp*= i, ans+= 1 / tmp;
printf ( "%.8lf\n" , ans) ;
return 0 ;
}
练习4-10 找出最小值
# include <stdio.h>
int main ( )
{
int n, minx= 0x7fffffff ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
{
int x;
scanf ( "%d" , & x) ;
if ( minx> x) minx= x;
}
printf ( "min = %d\n" , minx) ;
return 0 ;
}
练习4-11 统计素数并求和
# include <stdio.h>
int main ( )
{
int n, m, sum= 0 , cnt= 0 ;
scanf ( "%d%d" , & m, & n) ;
for ( int i= m; i<= n; i++ )
{
int flag= 0 ;
if ( i== 1 ) continue ;
for ( int j= 2 ; j* j<= i&& flag== 0 ; j++ )
if ( i% j== 0 ) flag= 1 ;
if ( ! flag) sum+= i, cnt++ ;
}
printf ( "%d %d\n" , cnt, sum) ;
return 0 ;
}
习题4-1 求奇数和
# include <stdio.h>
int main ( )
{
int n, sum= 0 ;
while ( 1 )
{
int x;
scanf ( "%d" , & x) ;
if ( x<= 0 ) break ;
if ( x% 2 ) sum+= x;
}
printf ( "%d\n" , sum) ;
return 0 ;
}
习题4-2 求幂级数展开的部分和
# include <stdio.h>
int main ( )
{
double x, fc= 1 , base, i= 2 ;
double sum= 1 ;
scanf ( "%lf" , & x) ;
base= x;
for ( int i= 1 ; ; i++ )
{
double l= base/ fc;
sum+= l;
if ( l< 0.00001 ) break ;
base*= x, fc*= ( i+ 1 ) ;
}
printf ( "%.4lf\n" , sum) ;
return 0 ;
}
习题4-3 求分数序列前N项和
# include <stdio.h>
int main ( void )
{
int n;
scanf ( "%d" , & n) ;
double fc= 2 , fm= 1 , t= 0 ;
double sum= 0 ;
for ( int i= 1 ; i<= n; i++ )
{
sum+= fc/ fm;
t= fc;
fc= fc+ fm;
fm= t;
}
printf ( "%0.2lf" , sum) ;
return 0 ;
}
习题4-4 特殊a串数列求和
# include <stdio.h>
int main ( void )
{
int n, a, sum= 0 , p= 0 ;
scanf ( "%d%d" , & a, & n) ;
for ( int i= 1 ; i<= n; i++ )
{
p= p* 10 + a;
sum+= p;
}
printf ( "s = %d\n" , sum) ;
return 0 ;
}
习题4-5 换硬币
在#include < stdio. h>
int main ( void )
{
int n, tot= 0 ;
scanf ( "%d" , & n) ;
for ( int i= n/ 5 ; i>= 1 ; i-- )
for ( int j= n/ 2 ; j>= 1 ; j-- )
for ( int k= n; k>= 1 ; k-- )
if ( i* 5 + j* 2 + k== n) printf ( "fen5:%d, fen2:%d, fen1:%d, total:%d\n" , i, j, k, i+ j+ k) , tot++ ;
printf ( "count = %d\n" , tot) ;
return 0 ;
}
习题4-6 水仙花数
# include <stdio.h>
# include <math.h>
int main ( )
{
int N, num;
int min, max;
int sum;
scanf ( "%d" , & N) ;
min= pow ( 10 , N- 1 ) ;
max= pow ( 10 , N) - 1 ;
if ( N== 7 )
{
printf ( "1741725\n" ) ;
printf ( "4210818\n" ) ;
printf ( "9800817\n" ) ;
printf ( "9926315\n" ) ;
}
else
{
for ( min; min<= max; min++ )
{
num= min;
sum= 0 ;
for ( int i= 1 ; i<= N; i++ )
{
int item;
item= pow ( num% 10 , N) ;
sum= sum+ item;
num= num/ 10 ;
}
if ( min== sum) printf ( "%d\n" , min) ;
}
}
return 0 ;
}
习题4-7 最大公约数和最小公倍数
# include <stdio.h>
# include <math.h>
int gcd ( int a, int b)
{
if ( ! b) return a;
return gcd ( b, a% b) ;
}
int main ( )
{
int a, b;
scanf ( "%d%d" , & a, & b) ;
printf ( "%d %d\n" , gcd ( a, b) , a* b/ gcd ( a, b) ) ;
return 0 ;
}
习题4-8 高空坠球
# include <stdio.h>
# include <math.h>
int main ( )
{
double s= 0 , h;
int n;
scanf ( "%lf%d" , & h, & n) ;
for ( int i= 1 ; i<= n; i++ )
{
s+= h;
if ( i!= 1 ) s+= h;
h/= 2 ;
}
printf ( "%.1lf %.1lf\n" , s, n== 0 ? 0 : h) ;
return 0 ;
}
习题4-9 打印菱形图案
# include <stdio.h>
int main ( )
{
int n= 0 ;
scanf ( "%d" , & n) ;
int row= ( n/ 2 ) + 1 ;
for ( int i= 1 ; i<= row; i++ )
{
for ( int j= row- i; j> 0 ; j-- )
printf ( " " ) ;
for ( int j= 0 ; j< ( 2 * i- 1 ) ; j++ )
printf ( "* " ) ;
printf ( "\n" ) ;
}
for ( int i= 1 ; i< row; i++ )
{
for ( int j= 0 ; j< i; j++ )
printf ( " " ) ;
for ( int j= ( row- i) * 2 - 1 ; j> 0 ; j-- )
printf ( "* " ) ;
printf ( "\n" ) ;
}
return 0 ;
}
习题4-10 猴子吃桃问题
# include <stdio.h>
int main ( )
{
int n, sum= 1 ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i< n; i++ )
sum= ( sum+ 1 ) * 2 ;
printf ( "%d\n" , sum) ;
return 0 ;
}
习题4-11 兔子繁衍问题
# include <stdio.h>
int main ( )
{
int n;
scanf ( "%d" , & n) ;
if ( n<= 1 )
{
puts ( "1" ) ;
return 0 ;
}
int a= 1 , b= 1 ;
for ( int i= 3 ; ; i++ )
{
int c= a+ b;
a= b, b= c;
if ( c>= n)
{
printf ( "%d\n" , i) ;
return 0 ;
}
}
return 0 ;
}
第五章
练习5-1 求m到n之和
int sum ( int m, int n)
{
int res= 0 ;
for ( int i= m; i<= n; i++ ) res+= i;
return res;
}
练习5-2 找两个数中最大者
int max ( int a, int b)
{
return a> b? a: b;
}
练习5-3 字符金字塔
void CharPyramid ( int n, char ch)
{
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= 1 ; j<= ( n- i) ; j++ ) printf ( " " ) ;
for ( int j= 1 ; j<= i; j++ ) printf ( "%c " , ch) ;
printf ( "\n" ) ;
}
}
习题5-1 符号函数
int sign ( int x)
{
if ( x< 0 ) return - 1 ;
if ( x== 0 ) return 0 ;
if ( x> 0 ) return 1 ;
}
习题5-2 使用函数求奇数和
int even ( int n)
{
return ( n+ 1 ) % 2 ;
}
int OddSum ( int List[ ] , int N)
{
int sum= 0 ;
for ( int i= 0 ; i< N; i++ )
if ( ! even ( List[ i] ) ) sum+= List[ i] ;
return sum;
}
习题5-3 使用函数计算两点间的距离
double dist ( double x1, double y1, double x2, double y2 )
{
return sqrt ( ( x1- x2) * ( x1- x2) + ( y1- y2) * ( y1- y2) ) ;
}
习题5-4 使用函数求素数和
int prime ( int p )
{
if ( p<= 0 ) return 0 ;
if ( p== 1 ) return 0 ;
if ( p== 2 ) return 1 ;
for ( int i= 2 ; i* i<= p; i++ )
if ( p% i== 0 ) return 0 ;
return 1 ;
}
int PrimeSum ( int m, int n )
{
int sum= 0 ;
for ( int i= m; i<= n; i++ )
sum+= prime ( i) * i;
return sum;
}
习题5-5 使用函数统计指定数字的个数
int CountDigit ( int number, int digit )
{
int cnt= 0 ;
if ( number< 0 ) number= - number;
do {
if ( digit== number% 10 ) cnt++ ;
number/= 10 ;
} while ( number) ;
return cnt;
}
习题5-6 使用函数输出水仙花数
int narcissistic ( int number )
{
int cnt= 0 , sum= 0 , p= number, l= number;
while ( number) number/= 10 , cnt++ ;
while ( p)
{
int x= p% 10 , tmp= 1 ;
for ( int i= 1 ; i<= cnt; i++ )
tmp*= x;
sum+= tmp;
p/= 10 ;
}
return sum== l;
}
void PrintN ( int m, int n )
{
for ( int i= m+ 1 ; i< n; i++ )
if ( narcissistic ( i) ) printf ( "%d\n" , i) ;
}
习题5-7 使用函数求余弦函数的近似值
double funcos ( double e, double x )
{
double sum= 0 ;
double tx= 1 , p= 1 , flag= 1 ;
for ( int i= 0 ; ; i++ )
{
if ( i% 2 == 0 )
{
sum+= flag* tx/ p;
if ( tx/ p< e) return sum;
flag= - flag;
}
tx*= x, p*= ( i+ 1 ) ;
}
}
习题5-8 空心的数字金字塔
void hollowPyramid ( int n)
{
int x= 1 ;
for ( int i= 1 ; i< n; i++ )
{
for ( int j= ( n- i) ; j>= 1 ; j-- ) printf ( " " ) ;
printf ( "%d" , i) ;
if ( i== 1 )
{
printf ( "\n" ) ;
continue ;
}
for ( int j= 1 ; j<= x; j++ ) printf ( " " ) ;
x+= 2 ;
printf ( "%d\n" , i) ;
}
for ( int i= 1 ; i<= ( 2 * n- 1 ) ; i++ ) printf ( "%d" , n) ;
}
第六章
练习6-3 英文字母替换加密(大小写转换+后移1位)
# include <stdio.h>
char s[ 1001 ] ;
int main ( )
{
while ( 1 )
{
char ch= getchar ( ) ;
if ( ch== '\n' ) break ;
if ( ch>= 'a' && ch<= 'z' )
{
if ( ch!= 'z' ) ch++ ;
else ch= 'a' ;
printf ( "%c" , ch- 'a' + 'A' ) ;
}
else if ( ch>= 'A' && ch<= 'Z' )
{
if ( ch!= 'Z' ) ch++ ;
else ch= 'A' ;
printf ( "%c" , ch- 'A' + 'a' ) ;
}
else printf ( "%c" , ch) ;
}
return 0 ;
}
习题6-1 分类统计字符个数
void StringCount ( char s[ ] )
{
int ans1= 0 , ans2= 0 , ans3= 0 , ans4= 0 ;
int i= 0 ;
while ( s[ i] != '\0' )
{
char c= s[ i] ;
if ( c== ' ' || c== '\n' || c== '\r' ) ans2++ ;
else if ( ( c>= 'a' && c<= 'z' ) || ( c>= 'A' && c<= 'Z' ) ) ans1++ ;
else if ( c>= '0' && c<= '9' ) ans3++ ;
else ans4++ ;
i++ ;
}
printf ( "letter = %d, blank = %d, digit = %d, other = %d\n" , ans1, ans2, ans3, ans4) ;
}
习题6-2 使用函数求特殊a串数列和
int fn ( int a, int n )
{
int sum= 0 ;
for ( int i= 1 ; i<= n; i++ )
sum= sum* 10 + a;
return sum;
}
int SumA ( int a, int n )
{
int sum= 0 ;
for ( int i= 1 ; i<= n; i++ )
sum+= fn ( a, i) ;
return sum;
}
习题6-3 使用函数输出指定范围内的完数
int factorsum ( int number )
{
int sum= 0 ;
for ( int i= 1 ; i< number; i++ )
if ( number% i== 0 ) sum+= i;
return sum;
}
void PrintPN ( int m, int n )
{
int flag= 1 ;
for ( int i= m; i<= n; i++ )
if ( factorsum ( i) == i)
{
flag= 0 ;
printf ( "%d =" , i) ;
int cnt= 0 ;
for ( int j= 1 ; j< i; j++ )
if ( i% j== 0 ) cnt++ ;
for ( int j= 1 ; j< i; j++ )
if ( i% j== 0 )
{
cnt-- ;
printf ( " %d" , j) ;
if ( cnt) printf ( " +" ) ;
}
puts ( "" ) ;
}
if ( flag) puts ( "No perfect number" ) ;
}
习题6-4 使用函数输出指定范围内的Fibonacci数
int fib ( int n )
{
int a= 0 , b= 1 , t;
for ( int i= 2 ; i<= n; i++ )
{
t= a+ b;
a= b;
b= t;
}
return b;
}
void PrintFN ( int m, int n )
{
int flag= 1 ;
for ( int i= 1 ; fib ( i) <= n; i++ )
if ( fib ( i) >= m)
{
if ( flag) printf ( "%d" , fib ( i) ) ;
else printf ( " %d" , fib ( i) ) ;
flag= 0 ;
}
if ( flag) puts ( "No Fibonacci number" ) ;
}
习题6-5 使用函数验证哥德巴赫猜想
int prime ( int p )
{
if ( p<= 1 ) return 0 ;
if ( p== 2 ) return 1 ;
for ( int i= 2 ; i* i<= p; i++ )
if ( p% i== 0 ) return 0 ;
return 1 ;
}
void Goldbach ( int n )
{
for ( int i= 2 ; i<= n; i++ )
if ( prime ( i) && prime ( n- i) )
{
printf ( "%d=%d+%d" , n, i, n- i) ;
return ;
}
}
习题6-6 使用函数输出一个整数的逆序数
int reverse ( int number )
{
int sum= 0 ;
do {
sum= sum* 10 + number% 10 ;
number/= 10 ;
} while ( number) ;
return sum;
}
习题6-6 使用函数输出一个整数的逆序数
int reverse ( int number )
{
int sum= 0 ;
do {
sum= sum* 10 + number% 10 ;
number/= 10 ;
} while ( number) ;
return sum;
}
习题6-7 简单计算器
# include <stdio.h>
int main ( )
{
int i, sum, is= 0 ;
char op= '0' ;
scanf ( "%d" , & sum) ;
while ( op!= '=' )
{
scanf ( "%c" , & op) ;
if ( op== '=' ) break ;
scanf ( "%d" , & i) ;
if ( op== '+' ) sum= sum+ i;
else if ( op== '-' ) sum= sum- i;
else if ( op== '*' ) sum= sum* i;
else if ( op== '/' )
{
if ( i!= 0 ) sum= sum/ i;
else is= 1 ;
}
else is= 1 ;
}
if ( is== 1 ) printf ( "ERROR" ) ;
else printf ( "%d\n" , sum) ;
return 0 ;
}
习题6-8 单词首字母大写
# include <stdio.h>
int main ( )
{
int w= 1 ; char c;
while ( ( c= getchar ( ) ) != '\n' )
{
if ( c== ' ' ) w= 1 ;
else if ( w)
{
w= 0 ;
if ( c>= 'a' && c<= 'z' ) c-= 32 ;
}
putchar ( c) ;
}
}
第七章
练习7-2 求最大值及其下标
# include <stdio.h>
int main ( )
{
int maxi, id;
int n;
scanf ( "%d\n" , & n) ;
for ( int i= 0 ; i< n; i++ )
{
int x;
scanf ( "%d" , & x) ;
if ( i== 0 ) maxi= x, id= i;
else if ( maxi< x) maxi= x, id= i;
}
printf ( "%d %d\n" , maxi, id) ;
return 0 ;
}
练习7-3 将数组中的数逆序存放
# include <stdio.h>
int a[ 31 ] , n;
int main ( )
{
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
scanf ( "%d" , & a[ i] ) ;
for ( int i= n; i>= 1 ; i-- )
printf ( "%d%c" , a[ i] , i== 1 ? '\n' : ' ' ) ;
return 0 ;
}
练习7-4 找出不是两个数组共有的元素
# include <stdio.h>
int a[ 31 ] , b[ 31 ] , c[ 62 ] , tot, n, m;
int main ( )
{
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
scanf ( "%d" , & a[ i] ) ;
scanf ( "%d" , & m) ;
for ( int i= 1 ; i<= m; i++ )
scanf ( "%d" , & b[ i] ) ;
for ( int i= 1 ; i<= n; i++ )
{
int p= 1 ;
for ( int j= 1 ; j<= tot&& p; j++ )
if ( a[ i] == c[ j] ) p= 0 ;
if ( ! p) continue ;
int flag= 1 ;
for ( int j= 1 ; j<= m&& flag; j++ )
if ( a[ i] == b[ j] ) flag= 0 ;
if ( flag) c[ ++ tot] = a[ i] ;
}
for ( int i= 1 ; i<= m; i++ )
{
int p= 1 ;
for ( int j= 1 ; j<= tot&& p; j++ )
if ( b[ i] == c[ j] ) p= 0 ;
if ( ! p) continue ;
int flag= 1 ;
for ( int j= 1 ; j<= n; j++ )
if ( b[ i] == a[ j] ) flag= 0 ;
if ( flag) c[ ++ tot] = b[ i] ;
}
for ( int i= 1 ; i<= tot; i++ )
{
if ( i!= 1 ) printf ( " " ) ;
printf ( "%d" , c[ i] ) ;
}
return 0 ;
}
练习7-7 矩阵运算
# include <stdio.h>
int n, ans= 0 ;
int main ( )
{
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= n; j++ )
{
int x;
scanf ( "%d" , & x) ;
if ( i== n|| j== n|| i== n- j+ 1 ) continue ;
ans+= x;
}
printf ( "%d\n" , ans) ;
return 0 ;
}
练习7-8 方阵循环右移
# include <stdio.h>
int a[ 20 ] [ 20 ] , n, m;
int main ( )
{
scanf ( "%d%d" , & m, & n) ;
m%= n;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
scanf ( "%d" , & a[ i] [ j] ) ;
for ( int i= 0 ; i< n; i++ )
{
for ( int j= 0 ; j< n; j++ )
printf ( "%d " , a[ i] [ ( n- m+ j) % n] ) ;
puts ( "" ) ;
}
return 0 ;
}
练习7-9 计算天数
# include <stdio.h>
int a[ 14 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
int main ( )
{
int year, month, day;
int ans= 0 ;
scanf ( "%d/%d/%d" , & year, & month, & day) ;
if ( ( ( year% 4 == 0 ) && ( year% 100 ) ) || ( year% 400 == 0 ) ) a[ 2 ] ++ ;
for ( int i= 1 ; i< month; i++ ) ans+= a[ i] ;
ans+= day;
printf ( "%d\n" , ans) ;
return 0 ;
}
练习7-10 查找指定字符
# include <stdio.h>
# include <string.h>
char s[ 300 ] , p[ 30 ] ;
int main ( )
{
int len, id= - 1 ;
scanf ( "%s\n" , p) ;
for ( int i= 0 ; ; i++ )
{
char sp= getchar ( ) ;
if ( sp== '\n' ) break ;
if ( sp== p[ 0 ] ) id= i;
}
if ( id== - 1 ) puts ( "Not Found" ) ;
else printf ( "index = %d\n" , id) ;
return 0 ;
}
练习7-11 字符串逆序
# include <stdio.h>
# include <string.h>
char s[ 300 ] , p[ 30 ] ;
int tot= 0 ;
int main ( )
{
for ( int i= 0 ; ; i++ )
{
char sp= getchar ( ) ;
if ( sp== '\n' ) break ;
s[ ++ tot] = sp;
}
for ( int i= tot; i>= 1 ; i-- ) printf ( "%c" , s[ i] ) ;
return 0 ;
}
习题7-1 选择法排序
# include <stdio.h>
# include <string.h>
int a[ 21 ] ;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ )
scanf ( "%d" , & a[ i] ) ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= n; j++ )
if ( a[ i] > a[ j] )
{
int tmp= a[ i] ;
a[ i] = a[ j] , a[ j] = tmp;
}
for ( int i= 1 ; i<= n; i++ ) printf ( "%d%c" , a[ i] , i== n? '\n' : ' ' ) ;
return 0 ;
}
习题7-2 求一批整数中出现最多的个位数字
# include <stdio.h>
# include <string.h>
int a[ 20 ] , ans;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
for ( int i= 1 , x; i<= n; i++ )
{
scanf ( "%d" , & x) ;
do {
a[ x% 10 ] ++ ;
x/= 10 ;
} while ( x) ;
}
for ( int i= 0 ; i<= 9 ; i++ )
if ( a[ i] > ans) ans= a[ i] ;
printf ( "%d:" , ans) ;
for ( int i= 0 ; i<= 9 ; i++ )
if ( a[ i] == ans) printf ( " %d" , i) ;
return 0 ;
}
习题7-3 判断上三角矩阵
# include <stdio.h>
int t, n;
int main ( )
{
scanf ( "%d" , & t) ;
while ( t-- )
{
scanf ( "%d" , & n) ;
int flag= 1 ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 , x; j<= n; j++ )
{
scanf ( "%d" , & x) ;
if ( i> j&& x) flag= 0 ;
}
if ( flag) puts ( "YES" ) ;
else puts ( "NO" ) ;
}
return 0 ;
}
习题7-4 求矩阵各行元素之和
# include <stdio.h>
int main ( )
{
int n, m;
scanf ( "%d%d" , & n, & m) ;
for ( int i= 1 ; i<= n; i++ )
{
int sum= 0 ;
for ( int j= 1 , x; j<= m; j++ )
scanf ( "%d" , & x) , sum+= x;
printf ( "%d\n" , sum) ;
}
return 0 ;
}
习题7-5 找鞍点
# include <stdio.h>
int n, a[ 6 ] [ 6 ] , row_max[ 6 ] , col_min[ 6 ] ;
int main ( )
{
scanf ( "%d" , & n) ;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
scanf ( "%d" , & a[ i] [ j] ) ;
for ( int i= 0 ; i< n; i++ )
{
int row_max_index= 0 ;
for ( int j= 1 ; j< n; j++ )
if ( a[ i] [ row_max_index] < a[ i] [ j] ) row_max_index= j;
row_max[ i] = a[ i] [ row_max_index] ;
}
for ( int i= 0 ; i< n; i++ )
{
int col_min_index = 0 ;
for ( int j= 1 ; j< n; j++ )
if ( a[ j] [ i] < a[ col_min_index] [ i] ) col_min_index= j;
col_min[ i] = a[ col_min_index] [ i] ;
}
int count= 0 ;
for ( int i= 0 ; i< n; i++ )
for ( int j= 0 ; j< n; j++ )
if ( a[ i] [ j] == row_max[ i] && a[ i] [ j] == col_min[ j] )
{
printf ( "%d %d\n" , i, j) ;
count++ ;
}
if ( count== 0 ) printf ( "NONE\n" ) ;
return 0 ;
}
习题7-6 统计大写辅音字母
# include <stdio.h>
int main ( )
{
char ch= 0 ;
int ans= 0 ;
while ( 1 )
{
ch= getchar ( ) ;
if ( ch== '\n' ) break ;
if ( ch>= 'A' && ch<= 'Z' )
if ( ch!= 'A' && ch!= 'E' && ch!= 'I' && ch!= 'O' && ch!= 'U' ) ans++ ;
}
printf ( "%d\n" , ans) ;
return 0 ;
}
习题7-7 字符串替换
# include <stdio.h>
int main ( )
{
char ch;
int ans= 0 ;
while ( 1 )
{
ch= getchar ( ) ;
if ( ch== '\n' ) break ;
if ( ch>= 'A' && ch<= 'Z' )
printf ( "%c" , 'Z' - ch+ 'A' ) ;
else printf ( "%c" , ch) ;
}
return 0 ;
}
习题7-8 字符串转换成十进制整数
# include <stdio.h>
int main ( )
{
char ch;
int ans= 0 , flag= 1 , w= 1 ;
while ( 1 )
{
ch= getchar ( ) ;
if ( ch== '#' ) break ;
if ( ch== '-' && w) flag= - 1 ;
if ( ch>= 'a' && ch<= 'f' ) ans= ans* 16 + ( ch- 'a' + 10 ) , w= 0 ;
if ( ch>= 'A' && ch<= 'F' ) ans= ans* 16 + ( ch- 'A' + 10 ) , w= 0 ;
if ( ch>= '0' && ch<= '9' ) ans= ans* 16 + ( ch- '0' ) , w= 0 ;
}
printf ( "%d\n" , flag* ans) ;
return 0 ;
}
第八章
练习8-2 计算两数的和与差
void sum_diff ( float op1, float op2, float * psum, float * pdiff )
{
* psum= op1+ op2;
* pdiff= op1- op2;
}
练习8-8 移动字母
void Shift ( char s[ ] )
{
int len= strlen ( s) ;
char p1= s[ 0 ] , p2= s[ 1 ] , p3= s[ 2 ] ;
for ( int i= 0 ; i<= len- 4 ; i++ )
s[ i] = s[ i+ 3 ] ;
s[ len- 3 ] = p1, s[ len- 2 ] = p2, s[ len- 1 ] = p3;
}
习题8-1 拆分实数的整数与小数部分
void splitfloat ( float x, int * intpart, float * fracpart )
{
* intpart= ( int ) x;
* fracpart= x- * intpart;
}
习题8-2 在数组中查找指定元素
int search ( int list[ ] , int n, int x )
{
for ( int i= 0 ; i< n; i++ )
if ( list[ i] == x) return i;
return - 1 ;
}
习题8-3 数组循环右移
void ArrayShift ( int a[ ] , int n, int m )
{
int c[ 300 ] , tot= 0 ;
m%= n;
for ( int i= n- m; i< n; i++ ) c[ tot++ ] = a[ i] ;
for ( int i= n- 1 ; i>= m; i-- ) a[ i] = a[ i- m] ;
for ( int i= 0 ; i< m; i++ ) a[ i] = c[ i] ;
}
习题8-4 报数
void CountOff ( int n, int m, int out[ ] )
{
int move, index= 0 ;
for ( int i= 0 ; i< n; i++ ) out[ i] = 0 ;
for ( int i= 0 ; i< n; i++ )
{
move= 0 ;
while ( index>= 0 )
{
index%= n;
if ( out[ index] == 0 )
move++ ;
if ( move== m)
{
out[ index] = i+ 1 ;
break ;
}
index++ ;
}
}
}
习题8-5 使用函数实现字符串部分复制
void strmcpy ( char * t, int m, char * s)
{
int len= 0 , i;
char * p= t;
while ( * p!= '\0' ) len++ , p++ ;
if ( m<= len)
{
for ( i= 0 ; t[ m- 1 + i] != '\0' ; i++ ) s[ i] = t[ m- 1 + i] ;
s[ i] = '\0' ;
}
else * s= '\0' ;
}
习题8-6 删除字符
void delchar ( char * str, char c )
{
char a[ MAXN] ;
int tot= 0 ;
for ( int i= 0 ; str[ i] != '\0' ; i++ )
if ( str[ i] != c) a[ tot++ ] = str[ i] ;
for ( int i= 0 ; i< tot; i++ )
str[ i] = a[ i] ;
str[ tot] = '\0' ;
}
习题8-7 字符串排序
# include <stdio.h>
# include <string.h>
char s[ 10 ] [ 100 ] ;
int main ( )
{
for ( int i= 1 ; i<= 5 ; i++ )
scanf ( "%s" , s[ i] ) ;
for ( int i= 1 ; i<= 5 ; i++ )
for ( int j= 2 ; j<= 5 ; j++ )
if ( strcmp ( s[ j] , s[ j- 1 ] ) < 0 )
{
char tmp[ 100 ] ;
strcpy ( tmp, s[ j- 1 ] ) ;
strcpy ( s[ j- 1 ] , s[ j] ) ;
strcpy ( s[ j] , tmp) ;
}
printf ( "After sorted:\n" ) ;
for ( int i= 1 ; i<= 4 ; i++ ) puts ( s[ i] ) ;
printf ( "%s" , s[ 5 ] ) ;
return 0 ;
}
习题8-8 判断回文字符串
bool palindrome ( char * s )
{
int len= strlen ( s) ;
for ( int i= 0 ; i< len; i++ )
if ( s[ i] != s[ len- 1 - i] ) return 0 ;
return 1 ;
}
习题8-9 分类统计各类字符个数
void StringCount ( char * s )
{
int ans1= 0 , ans2= 0 , ans3= 0 , ans4= 0 , ans5= 0 ;
for ( int i= 0 ; s[ i] != '\0' ; i++ )
{
if ( s[ i] >= 'A' && s[ i] <= 'Z' ) ans1++ ;
else if ( s[ i] >= 'a' && s[ i] <= 'z' ) ans2++ ;
else if ( s[ i] == ' ' ) ans3++ ;
else if ( s[ i] >= '0' && s[ i] <= '9' ) ans4++ ;
else ans5++ ;
}
printf ( "%d %d %d %d %d\n" , ans1, ans2, ans3, ans4, ans5) ;
}
习题8-10 输出学生成绩
# include <stdio.h>
# include <string.h>
int n;
int main ( )
{
scanf ( "%d" , & n) ;
double sum= 0 , maxi= - 1 , mini= 1e9 ;
for ( int i= 1 ; i<= n; i++ )
{
double x;
scanf ( "%lf" , & x) ;
sum+= x;
if ( maxi< x) maxi= x;
if ( mini> x) mini= x;
}
printf ( "average = %.2lf\nmax = %.2lf\nmin = %.2lf\n" , sum/ n, maxi, mini) ;
return 0 ;
}
第九章
习题9-1 时间换算
# include <stdio.h>
# include <string.h>
int hh, mm, ss, t;
int main ( )
{
scanf ( "%d:%d:%d" , & hh, & mm, & ss) ;
scanf ( "%d" , & t) ;
for ( int i= 1 ; i<= t; i++ )
{
ss++ ;
if ( ss== 60 ) ss= 0 , mm++ ;
if ( mm== 60 ) mm= 0 , hh++ ;
if ( hh== 24 ) hh= 0 ;
}
printf ( "%02d:%02d:%02d" , hh, mm, ss) ;
return 0 ;
}
习题9-2 计算两个复数之积
struct complex multiply ( struct complex x, struct complex y)
{
struct complex p;
p. real= x. real* y. real- x. imag* y. imag;
p. imag= x. real* y. imag+ x. imag* y. real;
return p;
}
习题9-3 平面向量加法
# include <stdio.h>
# include <math.h>
int main ( )
{
double x1, x2, y1, y2;
scanf ( "%lf%lf%lf%lf" , & x1, & y1, & x2, & y2) ;
double p1= x1+ x2, p2= y1+ y2;
if ( fabs ( p1) < 0.05 ) p1= 0 ;
if ( fabs ( p2) < 0.05 ) p2= 0 ;
printf ( "(%.1lf, %.1lf)" , p1, p2) ;
return 0 ;
}
习题9-4 查找书籍
# include <stdio.h>
# include <stdlib.h>
struct book {
char name[ 31 ] ;
double price;
} p[ 11 ] ;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
getchar ( ) ;
for ( int i= 0 ; i< n; i++ )
{
gets ( p[ i] . name) ;
scanf ( "%lf" , & p[ i] . price) ;
getchar ( ) ;
}
double max= - 1 , min= 100 ;
int maxid= 0 , minid= 0 ;
for ( int i= 0 ; i< n; i++ )
{
if ( p[ i] . price> max)
{
max= p[ i] . price;
maxid= i;
}
if ( p[ i] . price< min)
{
min= p[ i] . price;
minid= i;
}
}
printf ( "%.2f, %s\n" , p[ maxid] . price, p[ maxid] . name) ;
printf ( "%.2f, %s\n" , p[ minid] . price, p[ minid] . name) ;
return 0 ;
}
习题9-5 通讯录排序
# include <stdio.h>
# include <stdlib.h>
struct list {
char name[ 11 ] , num[ 18 ] ;
int date;
} p[ 22 ] , temp;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
getchar ( ) ;
for ( int i= 1 ; i<= n; i++ )
scanf ( "%s %d %s" , p[ i] . name, & p[ i] . date, p[ i] . num) ;
for ( int i= 2 ; i<= n; i++ )
for ( int j= 1 ; j<= n- i+ 1 ; j++ )
if ( p[ j] . date> p[ j+ 1 ] . date)
{
temp= p[ j] ;
p[ j] = p[ j+ 1 ] ;
p[ j+ 1 ] = temp;
}
for ( int i= 1 ; i<= n; i++ ) printf ( "%s %d %s\n" , p[ i] . name, p[ i] . date, p[ i] . num) ;
return 0 ;
}
习题9-6 按等级统计学生成绩
int set_grade ( struct student * p, int n )
{
int tot= 0 ;
for ( int i= 0 ; i< n; i++ )
{
if ( p[ i] . score>= 85 && p[ i] . score<= 100 ) p[ i] . grade= 'A' ;
if ( p[ i] . score>= 70 && p[ i] . score<= 84 ) p[ i] . grade= 'B' ;
if ( p[ i] . score>= 60 && p[ i] . score<= 69 ) p[ i] . grade= 'C' ;
if ( p[ i] . score>= 0 && p[ i] . score<= 59 ) p[ i] . grade= 'D' , tot++ ;
}
return tot;
}
第十章
练习10-1 使用递归函数计算1到n之和
int sum ( int n )
{
if ( n<= 0 ) return 0 ;
if ( n> 0 ) return sum ( n- 1 ) + n;
}
习题10-1 判断满足条件的三位数
int search ( int n )
{
int sum= 0 ;
for ( int i= 1 ; i* i<= n; i++ )
if ( i* i>= 101 )
{
int p1= ( i* i) % 10 , p2= ( ( i* i) / 10 ) % 10 , p3= ( i* i) / 100 ;
if ( ( p1== p2&& p1!= p3) || ( p1== p3&& p1!= p2) || ( p2== p3&& p2!= p1) ) sum++ ;
}
return sum;
}
习题10-2 递归求阶乘和
double fact ( int n )
{
if ( n== 0 ) return 1 ;
return fact ( n- 1 ) * n;
}
double factsum ( int n )
{
double sum= 0 ;
for ( int i= 1 ; i<= n; i++ )
sum+= fact ( i) ;
return sum;
}
习题10-3 递归实现指数函数
double calc_pow ( double x, int n )
{
if ( n== 0 ) return 1 ;
return calc_pow ( x, n- 1 ) * x;
}
习题10-4 递归求简单交错幂级数的部分和
double fn ( double x, int n )
{
if ( n== 0 ) return 0 ;
double p= 1 ;
for ( int i= 1 ; i<= n; i++ )
p*= x;
return fn ( x, n- 1 ) + p* ( n% 2 ? 1 : - 1 ) ;
}
习题10-5 递归计算Ackermenn函数
int Ack ( int m, int n )
{
if ( m== 0 ) return n+ 1 ;
if ( n== 0 ) return Ack ( m- 1 , 1 ) ;
return Ack ( m- 1 , Ack ( m, n- 1 ) ) ;
}
习题10-6 递归求Fabonacci数列
int f ( int n )
{
if ( n== 0 ) return 0 ;
if ( n== 1 ) return 1 ;
return f ( n- 1 ) + f ( n- 2 ) ;
}
习题10-7 十进制转换二进制
void dectobin ( int n )
{
if ( n== 1 )
printf ( "1" ) ;
if ( n== 0 )
printf ( "0" ) ;
if ( n>= 2 )
{
dectobin ( n/ 2 ) ;
printf ( "%d" , n% 2 ) ;
}
}
习题10-8 递归实现顺序输出整数
void printdigits ( int n )
{
if ( n<= 9 ) printf ( "%d\n" , n) ;
else
{
printdigits ( n/ 10 ) ;
printf ( "%d\n" , n% 10 ) ;
}
}
习题10-11 有序表的增删改查操作
int insert ( int a[ ] , int value)
{
int i;
for ( i= 0 ; i< Count; i++ )
if ( value== a[ i] ) return - 1 ;
for ( i= 0 ; i< Count; i++ )
if ( value< a[ i] ) break ;
for ( int j= Count; j> i; j-- )
a[ j] = a[ j- 1 ] ;
a[ i] = value;
Count++ ;
return 0 ;
}
int del ( int a[ ] , int value)
{
int i, flag= 1 ;
for ( i= 0 ; i< Count; i++ )
if ( value== a[ i] ) flag= 0 ;
if ( flag) return - 1 ;
for ( i= 0 ; i< Count; i++ )
if ( value== a[ i] ) break ;
for ( int j= i; j< Count; j++ )
a[ j] = a[ j+ 1 ] ;
Count-- ;
return 0 ;
}
int modify ( int a[ ] , int value1, int value2)
{
if ( del ( a, value1) == - 1 ) return - 1 ;
if ( insert ( a, value2) == - 1 ) return - 1 ;
return 0 ;
}
int query ( int a[ ] , int value)
{
int l= 0 , r= Count- 1 ;
while ( l<= r)
{
int mid= ( l+ r) >> 1 ;
if ( a[ mid] == value) return mid;
else if ( a[ mid] > value) r= mid- 1 ;
else if ( a[ mid] < value) l= mid+ 1 ;
}
return - 1 ;
}
第十一章
练习11-4 字符定位(最后一次找到的字符)
char * match ( char * s, char ch)
{
char * p= NULL ;
while ( * s!= '\0' )
{
if ( * s== ch) p= s;
s++ ;
}
return p;
}
习题11-1 输出月份英文名
char * getmonth ( int n )
{
static char s[ 12 ] [ 12 ] = { "January" , "February" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "November" , "December" } ;
char * ps= NULL ;
if ( n>= 1 && n<= 12 ) return s[ n- 1 ] ;
return ps;
}
习题11-2 查找星期
int getindex ( char * s )
{
static char ps[ 7 ] [ 10 ] = { "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" } ;
for ( int i= 0 ; i<= 6 ; i++ )
{
int len= strlen ( ps[ i] ) ;
int L= strlen ( s) ;
int flag= 1 ;
if ( L!= len) continue ;
for ( int j= 0 ; j< len; j++ )
if ( ps[ i] [ j] != s[ j] ) flag= 0 ;
if ( flag) return i;
}
return - 1 ;
}
习题11-3 计算最长的字符串长度
int max_len ( char * s[ ] , int n )
{
int max_lenx= 0 ;
for ( int i= 0 ; i< n; i++ )
max_lenx= strlen ( s[ i] ) < max_lenx? max_lenx: strlen ( s[ i] ) ;
return max_lenx;
}
习题11-4 字符串的连接
char * str_cat ( char * s, char * t )
{
int len1= strlen ( s) , len2= strlen ( t) ;
for ( int i= len1; i<= len1+ len2; i++ )
s[ i] = t[ i- len1] ;
return s;
}
习题11-5 指定位置输出字符串
char * match ( char * s, char ch1, char ch2 )
{
for ( int i= 0 ; i< strlen ( s) ; i++ )
{
if ( s[ i] == ch1)
{
for ( int j= i; j< strlen ( s) ; j++ )
{
printf ( "%c" , s[ j] ) ;
if ( s[ j] == ch2)
break ;
}
printf ( "\n" ) ;
return ( s+ i) ;
}
}
printf ( "\n" ) ;
return s+ strlen ( s) ;
}
习题11-6 查找子串
char * search ( char * s, char * t )
{
int len1= strlen ( s) , len2= strlen ( t) ;
for ( int i= 0 ; i< len1; i++ )
{
int flag= 1 ;
for ( int j= 0 ; j< len2; j++ )
if ( s[ i+ j] != t[ j] ) flag= 0 ;
if ( flag) return s+ i;
}
return NULL ;
}
习题11-7 奇数值结点链表
struct ListNode * readlist ( )
{
struct ListNode * head= NULL , * last= NULL ;
int n;
while ( 1 )
{
scanf ( "%d" , & n) ;
if ( n== - 1 ) break ;
struct ListNode * now= ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ;
if ( head== NULL ) head= now;
now-> data= n;
now-> next= NULL ;
if ( last!= NULL ) last-> next= now;
last= now;
}
return head;
}
struct ListNode * getodd ( struct ListNode * * L)
{
struct ListNode * Even= NULL , * Odd= NULL , * pe, * po;
while ( * L)
{
int data= ( * L) -> data;
struct ListNode * q= ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ;
q-> data= data;
q-> next= NULL ;
if ( data% 2 )
{
if ( Odd) po-> next= q;
else Odd= q;
po= q;
}
else
{
if ( Even) pe-> next= q;
else Even= q;
pe= q;
}
* L= ( * L) -> next;
}
* L= Even;
return Odd;
}
习题11-8 单链表结点删除
struct ListNode * readlist ( )
{
struct ListNode * head= NULL , * last= NULL ;
int n;
while ( 1 )
{
scanf ( "%d" , & n) ;
if ( n== - 1 ) break ;
struct ListNode * now= ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ;
if ( head== NULL ) head= now;
now-> data= n;
now-> next= NULL ;
if ( last!= NULL ) last-> next= now;
last= now;
}
return head;
}
struct ListNode * deletem ( struct ListNode * L, int m )
{
struct ListNode * head= L, * last= NULL ;
while ( L)
{
if ( L-> data== m)
{
if ( last!= NULL ) last-> next= L-> next;
if ( L== head) head= L-> next;
}
else last= L;
L= L-> next;
}
return head;
}