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;
}