C语言函数练习1

本文通过一系列的C语言函数练习题,涵盖最大值、组合数、素数判断、辗转相除法、多项式计算、平方根、数字定位、十进制转换、自定义进制转换和哥德巴赫猜想验证等,旨在提升C语言函数的运用能力。

Problem A:【函数】最大值函数

题目描述
在这里插入图片描述

输入

每个输入包括4个整数,整数之间用空格隔开。
测试数据有多组,处理到输入结束

输出

输出4个整数的最大值,每个输出占1行。

样例输入

2 6 5 1
1 2 9 8

样例输出

6
9

答案

int max(int a,int b,int c,int d){
    int qmax = 0;
    if(a > qmax)
        qmax = a;
    if(b > qmax)
        qmax = b;
    if(c > qmax)
        qmax = c;
    if(d > qmax)
        qmax = d;
    return qmax;
}

Problem B:【函数】组合数函数及阶乘函数

题目描述
在这里插入图片描述
在这里插入图片描述

输入

测试数据有多组,处理到输入结束。

输出

测试数据有多组,处理到输入结束。

样例输入

6 3
5 1

样例输出

20
5

答案

int comb(int n, int m){
    return fac(n)/ (fac(m) * fac(n-m));
}
int fac(int n){
    int result = 1,i;
    for (i = 1;i <= n;i++)
        result *= i;
    return result;
}

Problem C:【函数】判断正整数N(N>1)是否为素数。

题目描述
对于正整数N(1<N<10000),如果N只能被1和N整除,则N为素数,否则N为合数。
请写一个函数实现。函数声明如下:
//判断一个数是否为素数
int isPrime(int);
裁判测试程序样例:
在这里插入图片描述

输入

输入一个正整数N(1<N<10000)。测试数据有多组,处理到输入结束。

输出

如果是素数,则输出"prime",否则输出“composite”。
每个输出占1行。

样例输入

2
3
4

样例输出

prime
prime
composite

答案

#include<math.h>
int isPrime(int n){
	int i,a,k;
	k = sqrt(n);
	for (i = 2; i <= k;i++){
		if (n % i == 0) break;
	}
	if (i <= k || n == 1) return 0;
	else return 1;
}

Problem D:【函数】自定义函数:利用辗转相除法求最大公约数

题目描述
本题要求实现一个自定义函数:利用辗转相除法求最大公约数。
函数接口定义:
int gcd(int a, int b);
裁判测试程序样例:
在这里插入图片描述
辗转相除法,是目前已知最古老的算法, 可追溯至公元前300年。
它首次出现于欧几里德(Euclidean)的《几何原本》(第VII卷,命题i和ii)中,在中国可以追溯至东汉时期的《九章算术》
辗转相除法计算两个正整数a和b的最大公约数,步骤描述如下:
(1) 如果b为0则最大公约数为a,算法结束
(2) 令r为a÷b所得余数
(3) 令a←b,b←r,并返回步骤(1)

输入

输入正整数a,b;
测试数据有多组,处理到输入结束。

输出

输出a和b的最大公约数,每个输出占1行。

样例输入

24 60
18 15
23 21

样例输出

12
3
1

答案

int gcd(int a,int b){
    int c,m,t;
    if(a < b){
        t = a;
        a = b;
        b = t;
    }
    c=a % b;
    while(c != 0){
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}

Problem E:【函数】多项式函数

题目描述
在这里插入图片描述
在这里插入图片描述

输入

输入一个实数x。
测试数据有多组,处理到输入结束。

输出

输出多项式的值,结果要求保留1位小数。
每个输出占1行。

样例输入

1.2
2.3
0.5
-3.1
0.6

样例输出

17.5
47.3
6.3
-21.9
7.7

答案

double f(double x){
	double y;
	x=x * 1.0;
	y=0.8 * x * x * x + 3.0 * x * x + 9.0 * x + 1.0;
	return y;
}

Problem F:【函数】自定义平方根函数my_sqrt

题目描述
本题要求实现一个利用牛顿迭代法计算平方根的简单函数。
函数接口定义:
double my_sqrt(double x);
其中x是用户传入的参数, x是非负数。
裁判测试程序样例:
在这里插入图片描述
在这里插入图片描述

输入

测试数据有多组,处理到输入结束,每个输入都是非负实数。

输出

输出平方根,小数点后保留4位数字。每个输出占1行。

样例输入

2
3.532
4
5

样例输出

1.4142
1.8794
2.0000
2.2361

答案

double my_sqrt(double x){
	double a;
    double b;
    if(x==0) return 0.0000;
    a = 1;
    do {
        b = a;
        a = (b + x / b) / 2;
    } while (a != b);
    return a;
}

Problem G:【函数】自定义函数:正整数第K位的数字

题目描述
本题要求实现一个自定义函数:返回值为正整数n的第k位的数字(从右向左数)。
函数接口定义:
int getK(int n, int k);
其中n和k是用户传入的参数,如果k≤n,则该函数必须返回第k位数字,否则返回0。
裁判测试程序样例:
在这里插入图片描述

输入

正整数n,k
测试数据有多组,处理到输入结束。

输出

n的第k位数字,每个输出占1行。

样例输入

54321 1
54321 8
987654321 7

样例输出

1
0
7

答案

int getK(int n, int k){
	int i = 1;
    while(n){
        if(i == k)
            return n % 10 ;
        n /= 10;
        i++;
   }
   return 0 ;
}

Problem H:【函数】十进制转二进制

题目描述
输入一个十进制数N(32位整数),将它转换成二进制数输出。 要求用函数实现,并提交该函数定义。
本题要求实现1个自定义函数:将十进制转换成二进制并输出。
函数接口定义:
//输入一个十进制数,转换为2进制并输出
void decToBin(int);
裁判测试程序样例:
在这里插入图片描述

输入

输入数据包含多个测试实例,每个测试实例包含1个整数N(32位整数)。

输出

输出转换后的数,每个输出占1行。

样例输入

55
-23
42
-2

样例输出

110111
-10111
101010
-10

答案

#include <math.h>
void decToBin(int n){
	int i = 0,j = 0,b[32] = {0};
	    while (n){
	        b[i++] = n % 2;
	        n /= 2;
	}  
	printf("%d",b[i-1]);
	for (j = i - 2;j >= 0;j--){
	    printf("%d",abs(b[j]));
	}
	i = 0;
}

Problem I:【函数】十进制转成R进制

题目描述
输入一个十进制数N(32位整数),将它转换成R(2<=R<=16)进制数输出。
要求用函数实现。
本题要求实现1个自定义函数:将十进制转换成R进制并输出。
函数接口定义:
//输入一个十进制数,转换为R进制并输出
void decToR(int,int);
裁判测试程序样例:
在这里插入图片描述

输入

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16)。

输出

输出转换后的数。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

样例输入

23 12
-4 3

样例输出

1B
-11

答案

#include <string.h>
void decToR(int n,int r){
    if(n < 0){printf("-");n = -n;}
    if(n == 0){printf("0");}
    int c = 0,a[100],i;
    while(n){
        a[c] = (n % r);
        c++;
        n /= r;
    }
    for(i = c - 1;i >= 0;i--){
        if(a[i] >= 10) printf("%c",'A'+a[i]-10);
        else printf("%d",a[i]);
    }
}

Problem J:使用素数测试函数验证哥德巴赫猜想

题目描述
哥德巴赫猜想(Goldbach conjecture):任一大于2的偶数都可写成两个素数之和。
1742年6月,在哥德巴赫写给欧拉(Euler)的信中提出这个问题,目前为止无人证明这一猜想是否正确,最接近的证明结果是中国数学家陈景润在1973年证明的"1+2"成立,即"任一充分大的偶数都可以表示成两个素数的和,或是一个素数与两个素数乘积的和",在超级计算机上验证e3100(≈101346)范围内的偶数均没有找到反例 。
要求:编写素数测试函数 int isPrime(int n); 如果n为素数,函数返回1,否则返回0
main()函数中调用isPrime对输入的偶数N(N>2)进行分解验证

输入

输入一个大于2的偶数N,测试数据有多组,处理到输入结束。

输出

两个素数a和b,之间有一个空格,并且满足N=a+b且a≤b;
如果N的分解结果不止一组素数,则输出相差绝对值最大的一组

样例输入

4
10

样例输出

2 2
3 7

答案

#include <stdio.h>
#include <math.h>
int isPrime(int m){
	int n = sqrt( (float)m );
	int i,a = 1;
	for(i = 2; i<=n; i++){
		if(m%i == 0)
			a = 0;
			continue;
	}
	return a;
}
int main(){
	int N;
	while(scanf("%d",&N) != EOF){
		if(N==4) printf("2 2\n");
		else{
			for(int x=3; x<=N; x+=2){
				if(isPrime(x) == 1 && isPrime(N-x) == 1){
					printf("%d %d\n",x,N-x);
					break;
				}
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值