3、函数练习
3.1、函数表达式(1)
描述
根据以下公式计算数学表达式的值,并将结果作为函数值返回。在main()函数中输入x,调用函数fun(x),并输出fun(x)的值。
输入
输入1行,包含1个double类型的浮点数,即输入的变量x。
输出
输出1行,包含1个保留3位小数的double类型的浮点数,即输出的函数值。
输入样例 1 输入样例 2
0.26 8.5
输出样例 1 输出样例 2
0.265 1.904
具体实现
#include <stdio.h>
#include<math.h>
double fun(double x) {
double y;
if (x>=0)
y=(3*x*sin(x)+tan(x) )/(1.5+x);
else
y=(3*x*sin(x)+tan(x) )/(1.5-x);
return y;
}
int main (){
double x;
scanf("%lf",&x);
printf("%.3lf",fun(x));
return 0;
}
3.2、 函数表达式(2)
描述
根据以下公式计算数学表达式的值,并将结果作为函数值返回。在main()函数中输入x,调用函数fun(x),并输出fun(x)的值。
输入
输入1行,包含1个double类型的浮点数,即输入的变量x。
输出
输出1行,包含1个保留3位小数的double类型的浮点数,即输出的函数值。
输入样例 1 输入样例 2
0.26 18.5
输出样例 1 输出样例 2
0.607 342.250
具体实现
#include <stdio.h>
#include<math.h>
double fun(double x) {
double y;
if (x<10)
y=(sqrt(2.5+cos(x)))/(x*sin(x)+3);
else
y=x*x;
return y;
}
int main (){
double x;
scanf("%lf",&x);
printf("%.3lf",fun(x));
return 0;
}
3.3、实现找素数函数
描述
完成函数IsPrime(int x),该函数用于判断整数x是否为素数,并将判断结果作为函数值返回。在main()函数中输入2个正整数m和n分别作为区间的上、下界,调用函数IsPrime(x)求[m,n]区间内所有素数,并按从小到大的次序输出。
输入
输入1行,包含2个整数,即正整数m和n,两个整数之间用空格隔开。
输出
输出1行,包含多个整数,每个整数之间用空格隔开。
输入样例 1 输入样例 2
2 15 10 30
输出样例 1 输出样例 2
2 3 5 7 11 13 11 13 17 19 23 29
具体实现
#include <stdio.h>
#include<math.h>
int fun(int m,int n) {
for (;m<=n;m++)
{
int i;
for (i=2;i<m;i++) if (m%i==0) break;
if (i==m) printf ("%d ",m);
}
}
int main (){
int m,n;
scanf("%d%d",&m,&n);
fun(m,n);
return 0;
}
3.4、可逆素数
描述
完成函数IsPrime(int x)和函数Reverse(int x)。函数IsPrime(x)用于判断整数x是否为素数;函数Reverse(x)用于求整数x反序数(即将各位数字的顺序倒过来)。在main()函数中输入2个正整数m和n分别作为区间的上、下界,调用函数IsPrime(x)和函数Reverse(x)求[m, n]区间内所有可逆素数(即一个素数的反序数也是素数),并按从小到大的次序输出。
输入
输入1行,包含2个整数,即正整数m和n,两个整数之间用空格隔开。
输出
输出1行,包含多个整数,每个整数之间用空格隔开。
输入样例 1
10 50
输出样例 1
11 13 17 31 37
具体实现
#include <stdio.h>
#include<math.h>
int fun(int m,int n) {
int i,j,k;
int a,b,c,d;
for (;m<=n;m++){
for (i=2;i<m;i++) if (m%i==0) break;
if (i==m){
a=m%10;
b=m%100-a;
c=(m-a-b)/100;
if (m>100) d=a*100+b+c;
else d=b/10+a*10;
for (j=2;j<d;j++) if (d%j==0) break;
if (d==j) printf("%d ",m);
}
}
}
int main (){
int m,n;
scanf("%d%d",&m,&n);
fun(m,n);
return 0;
}
3.5、 最大公约数
描述
完成函数Gcd(int x, int y),该函数用于求整数x和y的最大公约数,并返回最大公约数。在main()函数中输入两个正整数a和b,调用函数Gcd求这两个整数的最大公约数,并输出求解结果。
输入
输入1行,包含2个整数,即正整数a和b,整数之间用空格隔开。
输出
输出1行,包含1个整数,即最大公约数。
输入样例 1
15 25
输出样例 1
5
具体实现
#include <stdio.h>
#include<math.h>
int Gcd(int a,int b) {
int rem;
while(b > 0){
rem = a % b;
a = b;
b = rem;
}
return a;
}
int main (){
int a,b;
scanf("%d%d",&a,&b);
printf("%d",Gcd(a,b));
return 0;
}
3.6、基于最大公约数的最小公倍数
描述
完成函数Gcd(int x, int y),该函数用于求整数x和y的最大公约数,并返回最大公约数。在main()函数中三个正整数a、b和c,调用函数Gcd求这个三个整数的最大公约数和最小公倍数,并输出求解结果。
输入
输入1行,包含3个整数,即正整数a、b和c,整数之间用空格隔开。
输出
输出1行,包括2个整数,即最大公约数和最小公倍数。
输入样例 1
2 4 6
输出样例 1
2 12
具体实现
#include <stdio.h>
int Gcd(int x,int y){ //用于求整数x和y的最大公约数
int r;
//**************************************
if (x < y){ //swap(x, y)
r = x;
x = y;
y = r;
}
//递归法(辗转相除法)求最大公约数
if(y==0){
return x;
}else{
return Gcd(y, x%y);
}
//======================================
}
int main(){
int a,b,c,t1,t2, t3, t4, t5; //a,b,c-用于求最大公约数和最小公倍数的三个整数,
scanf("%d%d%d",&a,&b,&c); //输入(接收)待求最大公约数和最小公倍数的3个整数
//**************************************
t1 = Gcd(a, b); //求整数a 和 b的最大公约数t1
t2 = Gcd(t1, c); //求整数t1 和 c的最大公约数t2 —— 三个数的最大公约数
t3 = (a * b)/t1; //求整数a 和 b的【最小公倍数】t3
t4 = Gcd(t3, c); //求整数t3 和 c的最大公约数t4
t5 = (t3 * c)/t4; //求整数t3 和 c的【最小公倍数】t5 —— 三个数的【最小公倍数】
printf("%d %d\n", t2, t5);
//======================================
return 0;
}
=================================================================
#include <stdio.h>
int Gcd(int x,int y){
while(y^=x^=y^=x%=y);
return x;
}
int main(){
int a,b,c,t1,t2;
scanf("%d%d%d",&a,&b,&c);
//**************************************
t1 = Gcd(Gcd(a, b),c);
t2 = (((a * b)/Gcd(a, b)) * c)/Gcd((a * b)/Gcd(a, b), c);
printf("%d %d\n", t1, t2);
//======================================
return 0;
}
3.7、 寻找最大平均偏差元素
描述
完成函数find(int a[], int n),该函数用于找出数组a中与所有元素的平均值绝对偏差最大的元素,并返回该元素值。在main()函数中输入数组a各元素的值以及元素个数n,调用函数find求解与平均值绝对偏差最大的元素,并输出求解结果。
输入
输入2行,第1行有1个整数,即元素个数n,第2行有n个整数,即数组a的元素值,整数之间用空格隔开。
输出
输出1行,包含1个整数,即与平均值绝对偏差最大的元素。
输入样例 1
10
23 21 5 98 89 12 86 80 8 61
输出样例 1
98
具体实现
#include <stdio.h>
#include<math.h>
int find(int a[],int n) {
int i,c,k,sum=0,avg=0;
c=abs(a[0]-avg);
k=0;
for (i=0;i<n;i++)
sum=sum+a[i];
avg=sum/n;
for (i=1;i<n;i++)
if (fabs(a[i]-avg)>c){
c=fabs(a[i]-avg);
k=i;
}
return a[k];
}
int main (){
int a[100];
int i,n;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
printf("%d",find(a,n));
return 0;
}
3.8、 寻找最小平均偏差元素及其下标
描述
完成函数find(int a[], int n),该函数用于找出数组a中与所有元素的平均值绝对偏差最小的元素,并返回该元素值以及该元素所在的下标。在main()函数中输入数组a各元素的值以及元素个数n,调用函数find求与平均值绝对偏差最小的元素及其下标,并输出求解结果。
输入
输入有2行,第1行有1个整数,即元素个数n,第2行有n个整数,即数组a的元素值,整数之间用空格隔开。
输出
输出有1行,包括2个整数,即与平均值绝对偏差最小的元素值和元素所在的下标。
输入样例 1
10
23 21 5 98 89 12 86 80 8 61
输出样例 1
61 9
具体实现
#include <stdio.h>
#include <math.h>
struct eType{
int x;
int index;
};
eType find(int a[],int n){
int k;
double avg=0.0, minDiff;
for(int i=0; i<n; i++){
avg += a[i];
}
if(n>0){
avg /=n;
}
k=0;
minDiff = fabs(a[0]-avg);
for(int t=1; t<n; t++){
if(fabs(a[t]-avg) < minDiff){
k=t;
minDiff = fabs(a[t]-avg);
}
}
struct eType rs={a[k], k};
return rs;
}
int main(){
int a[100];
int i,n;
eType f;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
f = find(a, n);
printf("%d %d\n", f.x, f.index);
return 0;
}
3.9、 递归计算阶乘和
描述
完成递归函数fact(int n),该函数用递归调用方法求n!的值,并返回该值。在main()函数中输入整数n,通过调用函数fact,求1!+2!+…+n!的值。
输入
输入1行,包含1个整数,即输入的整数n。
输出
输出1行,包含1个整数,即1!+2!+…+n!的值。
输入样例 1
3
输出样例 1
9
具体实现
#include <stdio.h>
#include<math.h>
int sum(int n) {
int f;
if(n==1)
f=1;
else
f=sum(n-1)*n;
return f;
}
int main ()
{
int i,n;
long s=0;
scanf("%d",&n);
for (i=1;i<n+1;i++)
s=s+sum(i);
printf ("%d",s);
return 0;
}
3.10、递归计算累加数列和
描述
完成递归函数fan(int a, int n),该函数递归调用方法求aa…a(n个a)的值。在main()函数中输入整数n,通过调用函数fan,求a+aa+aaa+aa…a(n个a)的值。2
输入
输入1行,包含2个整数,即输入的整数a和n,整数之间用空格分隔。
输出
输出1行,包含1个整数,a+aa+aaa+aa…a(n个a)的值。
输入样例 1
2 3
输出样例 1
246
具体实现
#include <stdio.h>
#include<math.h>
int sum(int a,int n) {
int i;
long sn,sum=0;
sn=0;
for(i=1;i<=n;i++){
sn=a+sn*10;
sum=sum+sn;
}
return sum;
}
int main ()
{
int a,n;
scanf("%d%d",&a,&n);
printf("%d",sum(a,n));
}
3.11、宏实现的区间整除性检查
描述
编写带参数的宏P,实现求2个整数相除的余数。在main()函数中输入2个正整数m和n分别作为区间的上、下界,利用宏P求[m,n]区间所有既被3整除也被7整除的数,并按从小到大的次序输出。
输入
输入1行,包括2个整数,即正整数m和n,两个整数之间用空格隔开。
输出
输出1行,包括多个整数,每个整数之间用空格隔开。
输入样例 1
10 30
输出样例 1
21
具体实现
#include <stdio.h>
#define p(a,b) a%b
int main ()
{
int m,n;
scanf("%d%d",&m,&n);
for (;m<=n;m++){
if(p(m,3)==0 && p(m,7)==0)
printf ("%d ",m);
}
return 0;
}
3.12、 三数最大值宏计算器
描述
编写带参数的宏MAX,实现求两数中的较大值。在main()函数中输入3个整数x、y和z,利用宏MAX求这三个数的最大值。
输入
输入1行,包括3个整数,即输入的整数x、y和z,整数之间用空格隔开。
输出
输出1行,包括1个整数,即三个数的最大值。
输入样例 1
100 800 300
输出样例 1
800
具体实现
#include <stdio.h>
#define MAX(a,b,c) c>(a>b?a:b)?c:(a>b?a:b)
int main ()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d",MAX(a,b,c));
return 0;
}