2023-2024-1 高级语言程序设计-函数

6-1 求m到n之和

本题要求实现一个计算m~n(m

函数接口定义:

 
  

int sum( int m, int n );

其中mn是用户传入的参数,保证有m

裁判测试程序样例:

 
  

#include int sum(int m, int n); int main() { int m, n; scanf("%d %d", &m, &n); printf("sum = %d\n", sum(m, n)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

-5 8

输出样例:

sum = 21
int sum( int m, int n ){
    int s=0;
    for(int i=m;i<=n;i++)
        s+=i;
    return s;
}

 6-2 简单输出整数

本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数。

函数接口定义:

 
  

void PrintN ( int N );

其中N是用户传入的参数。该函数必须将从1到N的全部正整数顺序打印出来,每个数字占1行。

裁判测试程序样例:

 
  

#include void PrintN ( int N ); int main () { int N; scanf("%d", &N); PrintN( N ); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

3

输出样例:

1
2
3
void PrintN ( int N ){
for(int i=1;i<=N;i++){
   printf("%d\n",i);
}
}

 6-3 统计个位数字

本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。

函数接口定义:

 
  

int Count_Digit ( const int N, const int D );

其中ND都是用户传入的参数。N的值不超过int的范围;D是[0, 9]区间内的个位数。函数须返回ND出现的次数。

裁判测试程序样例:

 
  

#include int Count_Digit ( const int N, const int D ); int main() { int N, D; scanf("%d %d", &N, &D); printf("%d\n", Count_Digit(N, D)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

-21252 2

输出样例:

3
int Count_Digit ( const int N, const int D ){
    int x=0,n=N;
     if(n<0)n=-n;
while(1){
    int a=n%10;
    if(a==D)x++;
    n=n/10;
    if(n==0)break;
}
    return x;
}

 6-4 找两个数中最大者

本题要求对两个整数a和b,输出其中较大的数。

函数接口定义:

 
  

int max( int a, int b );

其中ab是用户传入的参数,函数返回的是两者中较大的数。

裁判测试程序样例:

 
  

#include int max( int a, int b ); int main() { int a, b; scanf("%d %d", &a, &b); printf("max = %d\n", max(a, b)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

-5 8

输出样例:

max = 8
int max( int a, int b ){
    if(a>b)return a;
    else return b;
}

 6-5 数字金字塔

本题要求实现函数输出n行数字金字塔。

函数接口定义:

 
  

void pyramid( int n );

其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行数字金字塔。注

意每个数字后面跟一个空格。

裁判测试程序样例:

 
  

#include void pyramid( int n ); int main() { int n; scanf("%d", &n); pyramid(n); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

5

输出样例:

    1 
   2 2 
  3 3 3 
 4 4 4 4 
5 5 5 5 5 
void pyramid( int n ){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n-i;j++)printf(" ");
        for(int k=1;k<=i;k++)printf("%d ",i);
        printf("\n");
    }
}

 6-6 符号函数

本题要求实现符号函数sign(x)。

函数接口定义:

 
  

int sign( int x );

其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x) = −1。

裁判测试程序样例:

 
  

#include int sign( int x ); int main() { int x; scanf("%d", &x); printf("sign(%d) = %d\n", x, sign(x)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

10

输出样例:

sign(10) = 1
int sign( int x ){
    if(x>0)return 1;
    else if(x==0)return 0;
    else return -1;
}

6-7 判断奇偶性

本题要求实现判断给定整数奇偶性的函数。

函数接口定义:

 
  

int even( int n );

其中n是用户传入的整型参数。当n为偶数时,函数返回1;n为奇数时返回0。注意:0是偶数。

裁判测试程序样例:

 
  

#include int even( int n ); int main() { int n; scanf("%d", &n); if (even(n)) printf("%d is even.\n", n); else printf("%d is odd.\n", n); return 0; } /* 你的代码将被嵌在这里 */

输入样例1:

-6

输出样例1:

-6 is even.

输入样例2:

5

输出样例2:

5 is odd.
int even( int n ){
    if(n%2==0)return 1;
    else return 0;
}

 6-8 使用函数计算两点间的距离

本题要求实现一个函数,对给定平面任意两点坐标(x1​,y1​)和(x2​,y2​),求这两点之间的距离。

函数接口定义:

 
  

double dist( double x1, double y1, double x2, double y2 );

其中用户传入的参数为平面上两个点的坐标(x1y1)和(x2y2),函数dist应返回两点间的距离。

裁判测试程序样例:

 
  

#include #include 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; } /* 你的代码将被嵌在这里 */

输入样例:

10 10 200 100

输出样例:

dist = 210.24
double dist( double x1, double y1, double x2, double y2 ){
    return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}

6-9 使用函数统计指定数字的个数

本题要求实现一个统计整数中指定数字的个数的简单函数。

函数接口定义:

 
  

int CountDigit( int number, int digit );

其中number是不超过长整型的整数,digit为[0, 9]区间内的整数。函数CountDigit应返回numberdigit出现的次数。

裁判测试程序样例:

 
  

#include 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; } /* 你的代码将被嵌在这里 */

输入样例:

-21252 2

输出样例:

Number of digit 2 in -21252: 3
int CountDigit( int number, int digit ){
    int x=0,n=number;
     if(n<0)n=-n;
    if(n==0)return 1;
while(n){
    int a=n%10;
    if(a==digit)x++;
    n=n/10;}
    return x;

}

 6-10 使用函数输出水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。

函数接口定义:

 
  

int narcissistic( int number ); void PrintN( int m, int n );

函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。

函数PrintN则打印开区间(mn)内所有的水仙花数,每个数字占一行。题目保证100≤mn≤10000。

裁判测试程序样例:

 
  

#include int narcissistic( int number ); void PrintN( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m); PrintN(m, n); if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

153 400

输出样例:

153 is a narcissistic number
370
371
int narcissistic( int number ){
int n=number,m=number,x=0,y=0;
    while(m){
        y++;
        m/=10;
    }
    while(n){
        x+=pow(n%10,y);
        n/=10;
    }
    if(x==number)return 1;
    else return 0;
}
void PrintN( int m, int n ){
for(int i=m+1;i

6-11 使用函数求余弦函数的近似值

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:

cos(x)=x0/0!−x2/2!+x4/4!−x6/6!+⋯

函数接口定义:

 
  

double funcos( double e, double x );

其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。

裁判测试程序样例:

 
  

#include #include 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; } /* 你的代码将被嵌在这里 */

输入样例:

0.01 -3.14

输出样例:

cos(-3.14) = -0.999899
double funcos( double e, double x ){
    double y=0,s=0,z=1;int i=0,k=1;
    do{
        z=1;
        for(int j=1;j<=i;j++)
            z*=j;
        y=1.0*pow(x,i)/z;
        s+=k*y;
        k*=-1;i+=2;
    }while(y>=e);
    return s;
}

6-12 使用函数求特殊a串数列和

给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

函数接口定义:

 
  

int fn( int a, int n ); int SumA( int a, int n );

其中函数fn须返回的是na组成的数字;SumA返回要求的和。

裁判测试程序样例:

 
  

#include int fn( int a, int n ); int SumA( int a, int n ); int main() { int a, n; scanf("%d %d", &a, &n); printf("fn(%d, %d) = %d\n", a, n, fn(a,n)); printf("s = %d\n", SumA(a,n)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

2 3

输出样例:

fn(2, 3) = 222
s = 246
int fn( int a, int n ){
    int b=0;
for(int i=1;i<=n;i++){
    b=b*10+a;
}
    return b;
}
int SumA( int a, int n ){
int s=0,b=0;
for(int i=1;i<=n;i++){
    b=b*10+a;s+=b;
}
    return s;
}

6-13 使用函数输出指定范围内的完数

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0

函数接口定义:

 
  

int factorsum( int number ); void PrintPN( int m, int n );

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

裁判测试程序样例:

 
  

#include int factorsum( int number ); void PrintPN( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); if ( factorsum(m) == m ) printf("%d is a perfect number\n", m); if ( factorsum(n) == n ) printf("%d is a perfect number\n", n); PrintPN(m, n); return 0; } /* 你的代码将被嵌在这里 */

输入样例1:

6 30

输出样例1:

6 is a perfect number
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

输入样例2:

7 25

输出样例2:

No perfect number
int factorsum( int number ){
    int s=0;
    for(int i=1;i

6-14 使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

 
  

int prime( int p ); void Goldbach( int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。

裁判测试程序样例:

 
  

#include #include int prime( int p ); void Goldbach( int n ); int main() { int m, n, i, cnt; scanf("%d %d", &m, &n); if ( prime(m) != 0 ) printf("%d is a prime number\n", m); if ( m < 6 ) m = 6; if ( m%2 ) m++; cnt = 0; for( i=m; i<=n; i+=2 ) { Goldbach(i); cnt++; if ( cnt%5 ) printf(", "); else printf("\n"); } return 0; } /* 你的代码将被嵌在这里 */

输入样例:

89 100

输出样例:

89 is a prime number
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97, 
int prime( int p ){
int x=0;
    if(p<=1)return 0;
    for(int i=2;i<=sqrt(p);i++){
        if(p%i==0)x=1;
    }
    if(x==0)return 1;
    else return 0;
}
void Goldbach( int n ){
    for(int i=2;i<=n;i++){
        if(prime(i)==1&&prime(n-i)==1)
           { printf("%d=%d+%d",n,i,n-i);break;}
    }
}

6-15 使用函数输出一个整数的逆序数

本题要求实现一个求整数的逆序数的简单函数。

函数接口定义:

 
  

int reverse( int number );

其中函数reverse须返回用户传入的整型number的逆序数。

裁判测试程序样例:

 
  

#include int reverse( int number ); int main() { int n; scanf("%d", &n); printf("%d\n", reverse(n)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

-12340

输出样例:

-4321
int reverse( int number ){
int y=0,n=number;
    while(n){
        y=y*10+n%10;
        n/=10;
    }
    return y;
}

 6-16 统计各位数字之和是5的数

本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。

函数接口定义:

 
  

int is( int number ); void count_sum( int a, int b );

函数is判断number的各位数字之和是否等于5,是则返回1,否则返回0。

函数count_sum利用函数is统计给定区间[ab]内有多少个满足上述要求(即令is返回1)的整数,并计算这些整数的和。最后按照格式

count = 满足条件的整数个数, sum = 这些整数的和

进行输出。题目保证0<ab≤10000。

裁判测试程序样例:

 
  

#include int is( int number ); void count_sum( int a, int b ); int main() { int a, b; scanf("%d %d", &a, &b); if (is(a)) printf("%d is counted.\n", a); if (is(b)) printf("%d is counted.\n", b); count_sum(a, b); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

104 999

输出样例:

104 is counted.
count = 15, sum = 3720
int is( int number ){
    int x=0,n=number;
    while(n){
        x+=n%10;n/=10;
    }
    if(x==5)return 1;
    else return 0;
}
void count_sum( int a, int b ){
    int c=0,s=0;
    for(int i=a;i<=b;i++){
        if(is(i)){c++;s+=i;}
    }
    printf("count = %d, sum = %d",c,s);
}

6-17 简单实现x的n次方

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

函数接口定义:

 
  

double mypow( double x, int n );

函数mypow应返回xn次幂的值。题目保证结果在双精度范围内。

裁判测试程序样例:

 
  

#include 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; } /* 你的代码将被嵌在这里 */

输入样例:

0.24 4

输出样例:

0.003318
double mypow( double x, int n ){
    double y=1;
     for(int i=1;i<=n;i++){
         y=y*x;
     }
    return y;
}

 6-18 使用函数判断完全平方数

本题要求实现一个判断整数是否为完全平方数的简单函数。

函数接口定义:

 
  

int IsSquare( int n );

其中n是用户传入的参数,在长整型范围内。如果n是完全平方数,则函数IsSquare必须返回1,否则返回0。

裁判测试程序样例:

 
  

#include #include int IsSquare( int n ); int main() { int n; scanf("%d", &n); if ( IsSquare(n) ) printf("YES\n"); else printf("NO\n"); return 0; } /* 你的代码将被嵌在这里 */

输入样例1:

90

输出样例1:

NO

输入样例2:

100

输出样例2:

YES
int IsSquare( int n ){
    int x=sqrt(n);
    if(x*x==n)return 1;
    else return 0;
}

6-19 使用函数求1到10的阶乘和

本题要求实现一个计算非负整数阶乘的简单函数,使得可以利用该函数,计算1!+2!+⋯+10!的值。

函数接口定义:

 
  

double fact( int n );

其中n是用户传入的参数,其值不超过10。如果n是非负整数,则该函数必须返回n的阶乘。

裁判测试程序样例:

 
  

#include double fact( int n ); int main(void) { int i; double sum; sum = 0; for(i = 1; i <= 10; i++) sum = sum + fact(i); printf("1!+2!+...+10! = %f\n", sum); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

本题没有输入。

输出样例:

1!+2!+...+10! = 4037913.000000
double fact( int n ){
    double x=1;
    for(int i=1;i<=n;i++)x*=i;
    return x;
}

 6-20 使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。

函数接口定义:

 
  

int gcd( int x, int y );

其中xy是两个正整数,函数gcd应返回这两个数的最大公约数。

裁判测试程序样例:

 
  

#include int gcd( int x, int y ); int main() { int x, y; scanf("%d %d", &x, &y); printf("%d\n", gcd(x, y)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

32 72

输出样例:

8
int gcd( int x, int y ){
     return y?gcd(y,x%y):x;
}

6-21 递归计算Ackermenn函数 

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

函数接口定义:

 
  

int Ack( int m, int n );

其中mn是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型

范围内。

裁判测试程序样例:

 
  

#include 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-22 递归求Fabonacci数列

本题要求实现求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 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);
}

6-23 递归实现顺序输出整数

本题要求实现一个函数,对一个整数进行按位顺序输出。

函数接口定义:

 
  

void printdigits( int n );

函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。

裁判测试程序样例:

 
  

#include 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);
    else {printdigits(n/10);
         printf("\n%d",n%10);}
}

6-24 使用函数求素数和

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

 
  

int prime( int p ); int PrimeSum( int m, int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[mn]内所有素数的和。题目保证用户传入的参数mn

裁判测试程序样例:

 
  

#include #include 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; } /* 你的代码将被嵌在这里 */

输入样例:

-1 10

输出样例:

Sum of ( 2 3 5 7 ) = 17
int prime( int p ){
    int x=0; 
    if(p<=1)return 0;
    for(int i=2;i<=sqrt(p);i++){
        if(p%i==0){x=1;break;}
    }
    if(x==0)return 1;
    else return 0;
}
int PrimeSum( int m, int n ){
    int s=0;
    for(int i=m;i<=n;i++){
        if(prime(i)){s+=i;}
    }
    return s;
}

 6-25 求圆周率的近似值

编写函数fun,功能是用下面的表达式求圆周率的近似值,直到最后一项的绝对值小于等于一个给定的数值eps。

4ffd0400a155cf12c3a2afeefde7d3a0_139.jpg

函数接口定义:

 
  

float fun(float eps);

其中eps 是用户传入的参数。 函数返回表达式中累加项的绝对值小于等于eps  时的圆周率。

裁判测试程序样例:

 
  

#include #include float fun(float eps); int main() { float eps; scanf("%f", &eps); printf("%.4f\n",fun(eps)); return 0; } /* 请在这里填写答案 */

输入样例:

0.0001

输出样例:

3.1414
float fun(float eps){
    double x=0,s=0;
    for(int i=1;;i++){
        x=1.0/(2*i-1);
        if(x<=eps)break;
        s+=x*pow(-1,i+1);
    }
    return s*4;
}

6-26 求组合数(简版)

请编写函数,求组合数。

题图1.jpg

函数原型
 
  

double Cmb(int x, int y);

说明:x 和 y 为非负整数,且 x≥y,函数值为组合数 Cxy​。

裁判程序
 
  

#include ...(略)... double Cmb(int x, int y); int main() { int m, n; scanf("%d%d", &m, &n); printf("%.10g\n", Cmb(m, n)); return 0; } ...(略)... /* 你提交的代码将被嵌在这里 */

要求:利用前面作业中的阶乘函数和排列数函数完成计算。

输入样例
4 2

输出样例
6

double Cmb(int x, int y){
    double a=1,b=1,c=1;
     a=Fac(x);b=Fac(y);c=Fac(x-y);
    return a/(b*c);
}

你可能感兴趣的:(pta,算法,c++)