7-1 求算式的和[4] (20 分)
定义函数main(),输入正整数n,计算并输出下列算式的值。要求调用函数fact( n)计算n! ,函数返回值类型是double。
sum=
2!
1
+
3!
2
+…+
(n+1)!
n
输入格式:
输入在一行中给出一个正整数n。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。
输入样例:
3
输出样例:
sum = 0.958333
#include<stdio.h>
float fact(int n)
{
int f;
if(0==n) return 1;
f=fact(n-1)*n;
return f;
}
int main(void)
{
int n,i;
double sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
sum+=i/fact(i+1);
printf("sum = %lf",sum);
}
7-2 求组合数 (20 分)
本题要求编写程序,根据公式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
#include<stdio.h>
double fact(int n)
{
double f;
if(n==0) return 1.000000;
f= fact(n-1)*n;
return f;
}
int main(void)
{
int m,n;
double c;
scanf("%d %d",&m,&n);
c=fact(n)/(fact(m)*fact(n-m));
printf("result = %.lf",c);
return 0;
}
7-3 判断素数 (10 分)
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2
31
的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。
输入样例:
2
11
111
输出样例:
Yes
No
#include<stdio.h>
#include<math.h>
int prime(int n)
{
int i;
if(n<=1) return 0;
else if(n==2) return 1;
else if(n%2==0) return 0;
else
{
for(i=2;i<sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
}
int main(void)
{
int N,i,x,a[101];
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&x);
a[i]=prime(x);
}
for(i=0;i<N;i++)
{
if(a[i])
printf("Yes\n");
else
printf("No\n");
}
}
7-4 求n以内最大的k个素数以及它们的和 (20 分)
本题要求计算并输出不超过n的最大的k个素数以及它们的和。
输入格式:
输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。
输出格式:
在一行中按下列格式输出:
素数1+素数2+…+素数k=总和值
其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。
输入样例1:
1000 10
输出样例1:
997+991+983+977+971+967+953+947+941+937=9664
输入样例2:
12 6
输出样例2:
11+7+5+3+2=28
#include<stdio.h>
int prime(int n)
{
int i;
if(n<=1) return 0;
else if(n==2) return 1;
else
{
for(i=2;i<=n-1;i++)
if(n%i==0) return 0;
return 1;
}
}
int main(void)
{
int i,n,k,sum=0,count=0,j=-1;
int a[10];
scanf("%d %d",&n,&k);
for( i=n;i>0;i--)
{
if(prime(i))
{
a[++j]=i;
count++;
sum+=i;
}
if(k==count)
break;
}
printf("%d",a[0]);
for(i=1;i<=j;i++)
printf("+%d",a[i]);
printf("=%d",sum);
}
7-5 寻找完美数* (30 分)
所有真因子之和小于其本身的数称为亏数。如:4 的真因子 1、2 之和为 3,小于 4,是亏数。
所有真因子之和大于其本身的数称为盈数。如:12 的真因子 1、2、3、4、6 之和为 16,大于 12,是盈数。
不盈不亏的数,即:所有真因子之和等于其本身的数,称为完美数。如:6 的真因子 1、2、3 之和恰为 6,是完美数。
请编写程序,显示指定范围内的完美数。
输入格式
两个正整数 a 和 b,且 a ≤ b,即区间 [a, b] 的下限和上限。
输出格式
若区间内存在完美数,则在一行内输出全部完美数,以空格间隔。若区间不存在完美数,则输出“None”。
输入样例1
1 30
输出样例1
6 28
输入样例2
100 400
输出样例2
None
#include<stdio.h>
int nice(int n)
{
int i,sum=1,c;
if(1==n)
return 0;
for(i=2;i<n;i++)
{
c=n/i;
if(n%i==0)
{
sum+=c;
}
}
if(sum==n)
return 1;
return 0;
}
int main(void)
{
int m,n,i;
int a[100],j=-1;
int count=0;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++)
{
if(nice(i))
{
a[++j]=i;
count++;
}
}
if(0==count)
printf("None");
else
{
for(i=0;i<j;i++)
printf("%d ",a[i]);
printf("%d",a[j]);
}
}