软件1801-1803班《面向过程程序设计》(7)函数

6-1 使用函数输出指定范围内的完数 (10 分)
本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

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

裁判测试程序样例:
#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );
	
int main()
{
    int i, 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:
1 30
输出样例1:
1 is a perfect number
1 = 1
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
输入样例2:
7 25
输出样例2:
No perfect number

int factorsum( int number ){        		
	int sum = 1;                                  
	for(int i = 2;i <= (number / 2);i++){   
		if(number % i == 0){
			sum += i;		  
		}          	
	} 
	return sum;
}
void PrintPN( int m, int n ){
	
	int sum = 1;
	int cnt = 0; 
	if(m == 1) {
	printf("1 = 1\n");
	m += 1;
	cnt++;
	}
	for(int x = m;x <= n;x++){   
	
		for(int i = 2;i <= (x / 2);i++){  
			if(x%i == 0){
				sum += i;		
			}
		}
		if(sum == x){
			printf("%d = 1",x);
			for(int i = 2;i <= (x / 2);i++){   
				if(x % i == 0){
					printf(" + %d",i);  	
				}            
			}											
			printf("\n");               
			cnt++;
		} 
		sum = 1;
	}	
	if(cnt == 0){
		printf("No perfect number");
	}			
}
6-2 简单实现x的n次方 (10 分)
本题要求实现一个计算x
​n
​​ (n≥0)的函数。

函数接口定义:
double mypow( double x, int n );
函数mypow应返回x的n次幂的值。题目保证结果在双精度范围内。

裁判测试程序样例:
#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;
}

/* 你的代码将被嵌在这里 */
输入样例:
0.24 4
输出样例:
0.003318
double mypow( double x, int n )
{
	double sum = 1;
	while(n--)
	{
		sum *= x;
	} 
	return sum;
}
6-3 函数判断几位数 (10 分)
从键盘输入一个正整数,求出它是几位数。

函数接口定义:
int  data(int m)
其中m是用户传入的参数,该函数返回m是几位数。

裁判测试程序样例:
#include <stdio.h>
int  data(int m);
int main()
{
 int n;
  scanf("%d",&n);
  printf("weishu  is:  %d\n",data(n));
  return 0;
 }

/* 请在这里填写答案 */
输入样例:
123
输出样例:
weishu  is:  3
int  data(int m){
    int sum = 1;
    while(1)
    {
        m /= 10;
        if(m == 0)
        {
            return sum;
        } 
        else
        sum++;
    }
    
}
6-4 编写函数计算Sn=a+aa+aaa+…+aa…a (10 分)
编写函数计算Sn=a+aa+aaa+…+aa…a(最后一项为n个a)。

函数接口定义:
int fun(int a,int n);
其中a和n是用户传入的参数,函数fun的功能是求a+aa+aaa+…+aa…a(最后一项为n个a)值并返回。

裁判测试程序样例:
#include <stdio.h>
int fun(int a,int n);
int main()
{
  int a,n;
  scanf("%d%d",&a,&n);
  printf("%d\n",fun(a,n));
  return 0;
 }

/* 请在这里填写答案 */
输入样例:
3 4
输出样例:
3702
int fun(int a,int n){
    int sum = 0;
    int t = a;
    while(n>0)
    {
        sum += a;
        a = a * 10 + t;
        n--;
        //printf("%d   %d\n",a,sum);
    }
    return sum;
}
6-5 使用函数输出指定范围内的Fibonacci数 (10 分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

函数接口定义:
int fib( int n );
void PrintFN( int m, int n );
其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。

裁判测试程序样例:
#include <stdio.h>

int fib( int n );
void PrintFN( int m, int n );
	
int main()
{
    int m, n, t;

    scanf("%d %d %d", &m, &n, &t);
    printf("fib(%d) = %d\n", t, fib(t));
    PrintFN(m, n);

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例1:
20 100 7
输出样例1:
fib(7) = 13
21 34 55 89
输入样例2:
2000 2500 8
输出样例2:
fib(8) = 21
No Fibonacci number
int fib(int n)
{
    int i, x1, x2, x;
    x=0;
    x1=1;
    x2=1;
    for (i=3; i<=n; i++)
    {
        x=x1+x2;
        x1=x2;
        x2=x;
    }
    if (n==1 || n==2)
    x=1;
    return x;
}
 
 
void PrintFN(int m, int n)
{
    int i = 1, count, index = 0, flag = 0;
    while (fib(i) < 10000)
    i++;
    count = i;
    for (i = 1; i < count; i++)
    {
        if (fib(i) >= m && fib(i) <= n)
        {
            flag = 1;
            index++;
            if (index == 1)
            {
                printf("%d", fib(i));
                continue;
            }
            printf(" %d", fib(i));
        }
    }
    if (!flag)
    printf("No Fibonacci number");
    putchar('\n');
}
	
6-6 递归计算P函数 (10 分)
本题要求实现下列函数P(n,x)的计算,其函数定义如下:



函数接口定义:
double P( int n, double x );
其中n是用户传入的非负整数,x是双精度浮点数。函数P返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。

裁判测试程序样例:
#include <stdio.h>

double P( int n, double x );

int main()
{
    int n;
    double x;

    scanf("%d %lf", &n, &x);
    printf("%.2f\n", P(n,x));

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
10 1.7
输出样例:
3.05
double P( int n, double x )
{
	double result;
	if(n == 0)
	result = 1;
	else if(n == 1)
	result = x;
	else
	result = ((2 * n - 1) * P(n-1,x)-(n - 1) * P(n-2,x)) / n;
	return result;
}
7-1 求组合数 (15 分)
本题要求编写程序,根据公式C
​n
​m
​​ =
​m!(n−m)!
​
​n!
​​ 算出从n个不同元素中取出m个元素(m≤n)的组合数。

建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。

输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。

输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入样例:
2 7
输出样例:
result = 21
作者: 颜晖
单位: 浙江大学城市学院
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
#include<stdio.h>
double fact2(long long a,long long b){
	int sum=1;
	while(a > b)
	{
		sum*=a;
		a--;
	}

	return sum;
}
double fact1(long long b){
	int s=1;
	while(b>=1)
	{
		s*=b;
		b--;
	//	printf("1");
	}
	return s;
}


int main()
{
	long long m,n;
	scanf("%I64d %I64d",&m,&n);
	double s1 = fact2(n,n - m);
	double s2 = fact1(m);
	printf("result = %.0lf\n",s1/s2);

	return 0;
}
7-2 求幂之和 (15 分)
本题要求编写程序,计算sum=2
​1
​​ +2
​2
​​ +2
​3
​​ +⋯+2
​n
​​ 。可以调用pow函数求幂。

输入格式:
输入在一行中给出正整数n(≤10)。

输出格式:
按照格式“result = 计算结果”输出。

输入样例:
5
输出样例:
result = 62
#include<stdio.h>
#include<math.h>
int main(){
    int n;
    int sum = 0;
    scanf("%d",&n);
    while(n > 0){
        sum += pow(2,n);
        n--;
    }
    printf("result = %d\n",sum);
    
    return 0;
}
发布了55 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42612338/article/details/90518934