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;
    else
        return fact(n-1)*n;
}
double factsum( int n ){
    if(n<1)
        return 0;
    else
        return factsum(n-1)+fact(n);
}

3.递归实现计算x^{n}

输入实数x和正整数n,用递归函数计算x^{n}的值。试编写相应程序。

本题要求实现一个计算xn(n≥1)的函数。

函数接口定义:

double calc_pow( double x, int n );

函数calc_pow应返回xn次幂的值。建议用递归实现。题目保证结果在双精度范围内。

裁判测试程序样例:

#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;
    else
        return x*calc_pow(x,n-1);
}

4.递归求式子和

输入实数x和正整数n,用递归的方法对下列计算式子编写一个函数。

f(x,n) = x-x^{2}+x^{3}-x^{4}+...+(-1)^{n-1}x^{n} (n>0)

试编写相应程序。

本题要求实现一个函数,计算下列简单交错幂级数的部分和:

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);
        else
            return fn(x,n-1)+pow(x,n);
    }
}

5.递归计算函数ack(m,n)

输入m和n,编写递归函数计算Ackermenn函数的值:

 试编写相应程序。

本题要求实现Ackermenn函数的计算,其函数定义如下:

函数接口定义:

int Ack( int m, int n );

其中mn是用户传入的非负整数。函数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;
    else
        return 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.三角形面积为:

area=\sqrt{s\times(s-a)\times(s-b)\times(s-c) }

s = (a+b+c)/2

其中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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值