2-5-1
本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,根据公式P^m n=n!/(n−m)!算出从n个不同元素中取出m个元素(0<m≤n)的排列数。
#include <stdio.h>
double fact( int n );
int main(void)
{
int m, n;
double result;
scanf("%d%d", &m, &n);
if(m > 0 && n > 0 && m <= n){
result = fact(n)/fact(n-m);
printf("result = %.0f\n", result);
}
return 0;
}
double fact( int n ){
double s=1;
for(;n>1;n--){
s*=n;
}
return s;
}
2-5-5
本题要求实现一个计算x^n(n≥0)的函数。
#include <stdio.h>
double mypow( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%f\n", mypow(x, n));
return 0;
}
double mypow( double x, int n ){
double s=1;
for(;n>=1;n--){
s*=x;
}
return s;
}
4-2-2
自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,对给定的非负整数n,求该级数的前n+1项和。
#include <stdio.h>
double fact( int n );
int main(void)
{
int i, n;
double sum;
scanf("%d", &n);
sum = 1;
for(i = 1; i <= n; i++){
sum = sum + 1.0/fact(i);
}
printf("%f\n", sum);
return 0;
}
double fact( int n ){
double s=1;
for(;n>1;n--){
s*=n;
}
return s;
}
5-1
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
#include <stdio.h>
#include <math.h>
double dist( double x1, double y1, double x2, double y2 );
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("dist = %.2f\n", dist(x1, y1, x2, y2));
return 0;
}
double dist( double x1, double y1, double x2, double y2 ){
double d=sqrt(pow((x2-x1),2)+pow((y2-y1),2));
return d;
}
5-2
本题要求实现符号函数sign(x)。
函数接口定义:
int sign( int x );
其中x
是用户传入的整型参数。符号函数的定义为:若x
大于0,sign(x)
= 1;若x
等于0,sign(x)
= 0;否则,sign(x)
= −1。
#include <stdio.h>
int sign( int x );
int main()
{
int x;
scanf("%d", &x);
printf("sign(%d) = %d\n", x, sign(x));
return 0;
}
int sign( int x ){
if(x>0){
x=1;
}else if(x=0){
x=0;
}else{
x=-1;
}
return x;
}
5-3
本题要求实现求Fabonacci数列项的函数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
函数fib
应返回第n
项Fibonacci数。题目保证输入输出在长整型范围内。
#include <stdio.h>
int fib( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
int fib( int n ){
int s[n],i=2;
s[0]=1;
s[1]=1;
if(n>=3){
do{
s[i]=s[i-1]+s[i-2];
i++;
}while (i!=n);
}
return s[n-1];
}
5-4
本题要求实现一个简单函数,能计算给定的年份和月份的天数。使得可以利用该函数,输出给定年份中每个月的天数。其中1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,2月平年有28天,闰年有29天。判断闰年的条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。
其中year
和month
是用户传入的参数,如果1≤ month
≤12,该函数必须返回year
年month
月的天数。
#include <stdio.h>
int MonthDays(int year, int month);
int main()
{
int ndays, month, year;
scanf("%d", &year);
for(month = 1; month <= 12; month++){
ndays = MonthDays(year, month);
printf("%d ", ndays);
}
return 0;
}
int MonthDays(int year, int month){
int day;
switch (month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
day=31;break;
case 4:case 6:case 9:case 11:
day=30;break;
case 2:
if((year%4==0&&year%100!=0)||year%400==0){
day=29;break;
}else{
day=28;break;
}
}
return day;
}
5-5
本题要求实现一个计算两个数的最大公约数的简单函数。
#include <stdio.h>
int gcd( int x, int y );
int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));
return 0;
}
int gcd( int x, int y ){
int m,n;
if(x>y){
n=x%y;
while (n!=0){
m=n;
n=y%m;
y=m;
}
} else {
n=y%x;
while (n!=0){
m=n;
n=x%m;
x=m;
}
}
return m;
}
5-6
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
其中函数prime
当用户传入参数p
为素数时返回1,否则返回0;函数PrimeSum
返回区间[m
, n
]内所有素数的和。题目保证用户传入的参数m
≤n
。
#include <stdio.h>
int prime( int p );
int PrimeSum( int m, int n );
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
int prime( int p ){
int flag=1,i;
if(p<2) {
flag=0;
}else if(p==2){
flag=1;
}
for(i=2;i<p;i++){
if(p%i==0){
flag=0;
break;
}
}
return flag;
}
int PrimeSum( int m, int n ){
int flag,i,s=0;
if(m<2) m=2;
for(;m<=n;m++){
flag=1;
if(m==2) flag=1;
for(i=2;i<m;i++){
if(m%i==0){
flag=0;
break;
}
}
if(flag==1) s+=m;
}
return s;
}
5-7
本题要求实现函数输出一个实心的字符矩形,定义并调用函数matrix(length, width, ch)
,它的功能是在屏幕上显示行数为width
、列数为length
,由字符ch
组成的实心矩形图案。
其中length
是矩阵的长度,width
是矩阵的宽度,ch
是输出的字符,要求函数按照如样例所示的格式,打印出行数为width
、列数为length
,由字符ch
组成的实心矩形图案。
#include <stdio.h>
void matrix(int length, int width, char ch);
int main()
{
int length, width;
char ch;
scanf("%d %d %c", &length, &width, &ch);
matrix(length, width, ch);
return 0;
}
void matrix(int length, int width, char ch){
int i,j;
for(i=0;i<width;i++){
for(j=0;j<length;j++){
printf("%c",ch);
}
printf("\n");
}
}
5-8
本题要求实现函数求圆台体积,定义并调用函数volume_tc(r_lower, r_upper, h)
计算下底半径为r_lower
、上底半径为r_upper
、高度为h
的圆台的体积,函数类型是double
。
其中r_lower
是圆台的下底半径,r_upper
是圆台的上底半径,h
是圆台的高度,要求函数计算并返回圆台的体积。
#include <stdio.h>
#define PI 3.14159
double volume_tc(double r_lower, double r_upper, double h);
int main(void)
{
double h, r_lower, r_upper, v;
scanf("%lf%lf%lf", &r_lower, &r_upper, &h);
v = volume_tc(r_lower, r_upper, h);
printf("%.2f\n", v);
return 0;
}
double volume_tc(double r_lower, double r_upper, double h){
return PI*h*(r_lower*r_lower+r_lower*r_upper+r_upper*r_upper)/3.0;
}
5-9
本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x^0/0!−x^2/2!+x^4/4!−x^6/6!+⋯
其中用户传入的参数为误差上限e
和自变量x
;函数funcos
应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
double funcos( double e, double x ){
int i=0,j=-1,k;
double r=1,s=0;
do{
if(i==0) {
r=1;
}else {
r*=i*(i-1);
}
j=(-1)*j;
s+=1.0*j*pow(x,i)/r;
i+=2;
}while (fabs(1.0*pow(x,(i-2))/r)>=e);
return s;
}
5-10
本题要求实现一个统计整数中指定数字的个数的简单函数。
其中number
是不超过长整型的整数,digit
为[0, 9]区间内的整数。函数CountDigit
应返回number
中digit
出现的次数。
#include <stdio.h>
int CountDigit( int number, int digit );
int main()
{
int number, digit;
scanf("%d %d", &number, &digit);
printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));
return 0;
}
int CountDigit( int number, int digit ){
int a,i=0;
if(number<0) number=-number;
while(number%10!=0){
a=number%10;
if(a==digit) i++;
number/=10;
}
return i;
}
5-11
本题要求实现一个函数,输出n行空心的数字金字塔。
其中n
是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n
行空心的数字金字塔,请注意,最后一行的第一个数字前没有空格。
#include <stdio.h>
void hollowPyramid ( int n );
int main()
{
int n;
scanf("%d", &n);
hollowPyramid ( n );
return 0;
}
void hollowPyramid ( int n ){
int a=1,i,k;
for(i=0;i<n-1;i++){
for(k=1;k<=n-a;k++) printf(" ");
if(i==0){
printf("%d",a);
}else {
printf("%d",a);
for(k=1;k<2*i;k++) printf(" ");
printf("%d",a);
}
a++;
printf("\n");
}
for(i=0;i<2*n-1;i++){
printf("%d",n);
}
}