C语言程序设计(第四版)—习题10程序设计题
1.判断满足条件的三位数
编写一个函数,利用参数传入3位数n,找出101~n间所有满足下列两个条件的数:它是完全平方数,又有两位数字相同,如144、676等,函数返回找出这样的数据的个数。试编写相应程序。
本题要求实现一个函数,统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。
函数接口定义:
int search( int n );
其中传入的参数
int n
是一个三位数的正整数(最高位数字非0)。函数search
返回[101,n
]区间内所有满足条件的数的个数。裁判测试程序样例:
#include <stdio.h> #include <math.h>int search( int n );int main() {int number;scanf("%d",&number);printf("count=%d\n",search(number));return 0; }/* 你的代码将被嵌在这里 */
输入样例:
500
输出样例:
count=6
int search( int n ){int i,x,g,s,b,count=0;for(i=11;i<=sqrt(n);i++){x=pow(i,2);g=x%10;//个位s=x%100/10;//十位b=x/100;//百位if(g==s||g==b||s==b){count++;}} return count;
}
2.递归求阶乘和
输入一个整数n(n>0且n≤10),求1!+2!+3!+……+n!。定义并调用函数fact(n)计算n!,函数类型是double。试编写相应程序。
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。
函数接口定义:
double fact( int n ); double factsum( int n );
函数
fact
应返回n
的阶乘,建议用递归实现。函数factsum
应返回 1!+2!+...+n
! 的值。题目保证输入输出在双精度范围内。裁判测试程序样例:
#include <stdio.h>double fact( int n ); double factsum( int n );int main() {int n;scanf("%d",&n);printf("fact(%d) = %.0f\n", n, fact(n));printf("sum = %.0f\n", factsum(n));return 0; }/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
fact(10) = 3628800 sum = 4037913
输入样例2:
0
输出样例2:
fact(0) = 1 sum = 0
double fact( int n ){if(n<=1)return 1;elsereturn fact(n-1)*n;
}
double factsum( int n ){if(n<1)return 0;elsereturn factsum(n-1)+fact(n);
}
3.递归实现计算
输入实数x和正整数n,用递归函数计算的值。试编写相应程序。
本题要求实现一个计算xn(n≥1)的函数。
函数接口定义:
double calc_pow( double x, int n );
函数
calc_pow
应返回x
的n
次幂的值。建议用递归实现。题目保证结果在双精度范围内。裁判测试程序样例:
#include <stdio.h>double calc_pow( double x, int n );int main() {double x;int n;scanf("%lf %d", &x, &n);printf("%.0f\n", calc_pow(x, n));return 0; }/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
8
double calc_pow( double x, int n ){if(n<1)return 1;elsereturn x*calc_pow(x,n-1);
}
4.递归求式子和
输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。
试编写相应程序。
本题要求实现一个函数,计算下列简单交错幂级数的部分和:
f(x,n)=x−x2+x3−x4+⋯+(−1)n−1xn
函数接口定义:
double fn( double x, int n );
其中题目保证传入的
n
是正整数,并且输入输出都在双精度范围内。函数fn
应返回上述级数的部分和。建议尝试用递归实现。裁判测试程序样例:
#include <stdio.h>double fn( double x, int n );int main() {double x;int n;scanf("%lf %d", &x, &n);printf("%.2f\n", fn(x,n));return 0; }/* 你的代码将被嵌在这里 */
输入样例:
0.5 12
输出样例:
0.33
double fn( double x, int n ){if(n<=1)return x;else{if(n%2==0)return fn(x,n-1)-pow(x,n);elsereturn fn(x,n-1)+pow(x,n);}
}
5.递归计算函数ack(m,n)
输入m和n,编写递归函数计算Ackermenn函数的值:
试编写相应程序。
本题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义:
int Ack( int m, int n );
其中
m
和n
是用户传入的非负整数。函数Ack
返回Ackermenn函数的相应值。题目保证输入输出都在长整型范围内。
裁判测试程序样例:
#include <stdio.h>int Ack( int m, int n );int main() {int m, n;scanf("%d %d", &m, &n);printf("%d\n", Ack(m, n));return 0; }/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
9
int Ack( int m, int n ){if(m==0)return n+1;else if(n==0 && m>0)return Ack(m-1,1);else if(m>0 && n>0)return Ack(m-1,Ack(m,n-1));
}
6.递归实现求Fabonacci数列
用递归方法编写求斐波那契数列的函数,函数类型为整型,斐波那契数列的定义如下。试编写相应程序。
f(n) = f(n-2) + f(n-1)(n>1)其中f(0)=0,f(1)=1。
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义:
int f( int n );
函数
f
应返回第n
个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。裁判测试程序样例:
#include <stdio.h>int f( int n );int main() {int n;scanf("%d", &n);printf("%d\n", f(n));return 0; }/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8
int f( int n ){if(n==0)return 0;else if(n==1)return 1;elsereturn f(n-2)+f(n-1);
}
7.递归实现十进制转换二进制
输入一个正整n,将其转换为二进制后输出。要求定义并调用函数dectobin(n),它的功能是输出n的二进制。试编写相应程序。
本题要求实现一个函数,将非负整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数
dectobin
应在一行中打印出二进制的n
。建议用递归实现。裁判测试程序样例:
#include <stdio.h>void dectobin( int n );int main() {int n;scanf("%d", &n);dectobin(n);return 0; }/* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
1010
void dectobin( int n ){if(n == 0)printf("0");else if(n == 1)printf("1");else{dectobin(n/2);printf("%d",n%2);}
}
8.递归实现顺序输出整数
输入一个正整数n,编写递归函数实现对其进行按位顺序输出。试编写相应程序。
本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义:
void printdigits( int n );
函数
printdigits
应将n
的每一位数字从高位到低位顺序打印出来,每位数字占一行。裁判测试程序样例:
#include <stdio.h>void printdigits( int n );int main() {int n;scanf("%d", &n);printdigits(n);return 0; }/* 你的代码将被嵌在这里 */
输入样例:
12345
输出样例:
1 2 3 4 5
void printdigits( int n ){if(n<10)printf("%d\n",n);else{printdigits(n/10);printf("%d\n",n%10);}
}
9.
输入n(n<10)个整数,统计其中素数的个数。要求程序由两个文件组成,一个文件中编写main函数,另一个文件中编写素数判断的函数。使用文件包含的方式实现。试编写相应程序。
- main.h 主函数
#include<stdio.h>
#include<math.h>
#include "Prime.c"
int IsPrime(int x);
int main(){int n;scanf("%d",&n);int x;int num = 0;while(n--){scanf("%d",&x);if(IsPrime(x) == 1)num++;}printf("素数的个数:%d",num);return 0;
}
- Prime.c
int IsPrime(int x){if(x <= 1)return 0;//0不是素数,1是素数else if(x == 2)return 1;else{int item = sqrt(x)+1;int i;for(i=2;i<item;i++){if(x%i==0)break;}if(i>=item)return 1;return 0;}
}
10.三角形面积为:
其中a、b、c分别是三角形的3条边。请分别定义计算s和area的宏,再使用函数实现。比较两者在形式上和使用上的区别。
- 定义宏实现
#include<stdio.h>
#include<math.h>#define s(a,b,c) (a+b+c)/2
#define area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
int main(){double a,b,c;scanf("%lf %lf %lf",&a,&b,&c);printf("area = %.3f",area(a,b,c));return 0;
}
- 函数实现
#include<stdio.h>
#include<math.h>double s(double a,double b,double c){return (a+b+c)/2;
}
double area(double a,double b,double c){return sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c));
}
int main(){double a,b,c;scanf("%lf %lf %lf",&a,&b,&c);printf("area = %.3f",area(a,b,c));return 0;
}