目录
7-43 求组合数
本题要求编写程序,根据公式
C^m_n=\frac{n!}{m!(n-m)!}
算出从n个不同元素中取出m个元素(m≤n)的组合数。
建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。
输入样例:
2 7
输出样例:
result = 21
#include <stdio.h>
double Fac(int x){
double res=1;
for(int i=2;i<=x;i++){
res*=i;
}
return res;
}
int main(){
int m,n;scanf("%d %d",&m,&n);
double fz=Fac(n);
double fm=Fac(m)*Fac(n-m);
double res=fz/fm;
printf("result = %.0f",res);
}
7-44 求平方与倒数序列的部分和
本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m^2 + 1/m+ (m+1) ^2+ 1/(m+1)+…+ n ^2 + 1/n
输入格式:
输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例:
5 10
输出样例:
sum = 355.845635
#include <stdio.h>
#include <math.h>
int main(){
int m,n;scanf("%d %d",&m,&n);
double sum=0;
for(int i=m;i<=n;i++){
sum+=pow(i,2);
sum+=1.0/i;
}
printf("sum = %.6f",sum);
return 0;
}
7-45 求交错序列前N项和
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
5
输出样例:
0.917
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
double fm=1,sum=0;
int flag=1;
for(int i=1;i<=n;i++){
sum+=flag*i*1.0/fm;
fm+=2;
flag*=-1;
}
printf("%.3f",sum);
return 0;
}
7-46 求平方根序列前N项和
本题要求编写程序,计算平方根序列 \sqrt{1}+\sqrt{2}+\sqrt{3} +⋯的前N项之和。可包含头文件math.h
,并调用sqrt
函数求平方根。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
10
输出样例:
sum = 22.47
#include <stdio.h>
#include <math.h>
int main(){
int n;scanf("%d",&n);
double sum=0;
for(int i=1;i<=n;i++){
sum+=sqrt(i);
}
printf("sum = %.2f",sum);
return 0;
}
7-47 求阶乘序列前N项和
本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。
输入格式:
输入在一行中给出一个不超过12的正整数N。
输出格式:
在一行中输出整数结果。
输入样例:
5
输出样例:
153
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int sum=0,x=1;
for(int i=1;i<=n;i++){
x*=i;
sum+=x;
}
printf("%d",sum);
return 0;
}
7-48 求给定精度的简单交错序列部分和
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
#include <stdio.h>
#include <math.h>
int main(){
double x;scanf("%lf",&x);
double sum=0,flag=1;
for(int i=1;;i+=3){
sum=sum+flag*1.0/i;
flag*=-1;
if(1.0/i<=x) break;
}
printf("sum = %.6f",sum);
return 0;
}
7-49 猜数字游戏
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
#include <stdio.h>
int main(){
// 输入随机数和猜测的最大次数
int num,time;scanf("%d %d",&num,&time);
int x,cnt=0,flag=0;
while(1){
scanf("%d",&x);
cnt++;
if(cnt>time) break;
if(x<0) break;
else if(x>num) printf("Too big\n");
else if(x<num) printf("Too small\n");
else if(x==num) {
flag=1; // 猜到
break;
}
}
if(flag==1 && cnt<=time){
if(cnt==1) printf("Bingo!");
else if(cnt <= 3) printf("Lucky You!");
else if(cnt >3 && cnt<=time) printf("Good Guess!");
}
else printf("Game Over");
return 0;
}
// 该跳出循环 就应即时跳出 不然会超时
7-50 求e的近似值
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
#include <stdio.h>
double Fac(int x){
double res=1;
for(int i=1;i<=x;i++) res*=i;
return res;
}
double fac[1001];
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
fac[i]=Fac(i);
}
double sum=1;
for(int i=1;i<=n;i++){
sum+=1.0/fac[i];
}
printf("%.8f",sum);
return 0;
}
7-51 找出最小值
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int min=99999,x;
for(int i=0;i<n;i++){
scanf("%d",&x);
if(x<min) min=x;
}
printf("min = %d",min);
return 0;
}
7-52 统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
#include <stdio.h>
int isPrime(int x){
if(x==1) return 0;
if(x<=3) return 1;
if(x%2==0 || x%3==0) return 0;
for(int i=5;i*i<=x;i+=6){
if(x%i==0 || x%(i+2)==0) return 0;
}
return 1;
}
int main(){
int m,n;scanf("%d %d",&m,&n);
int cnt=0,sum=0;
for(int i=m;i<=n;i++){
if(isPrime(i)) {
cnt++;
sum+=i;
}
}
printf("%d %d",cnt,sum);
return 0;
}
7-53 求奇数和
本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
#include <stdio.h>
int main(){
int x;
int sum=0;
while(scanf("%d",&x) && x>0){
if(x%2!=0) sum+=x;
}
printf("%d",sum);
return 0;
}
7-54 求分数序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
#include <stdio.h>
#include <math.h>
int main(){
int n;scanf("%d",&n);
double fz=2,fm=1;
double sum=2;
for(int i=2;i<=n;i++){
sum+=(fz+fm)*1.0/fz;
// 更新分子分母
double temp=fz;
fz=fz+fm;
fm=temp;
}
printf("%.2f",sum);
return 0;
}
// 有一个测试没通过是因为数据类型!!!
7-55 特殊a串数列求和
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
#include <stdio.h>
int main(){
int a,n;scanf("%d %d",&a,&n);
int sum=0;
int x=0;
for(int i=1;i<=n;i++){
x=x*10+a;
sum+=x;
}
printf("s = %d",sum);
return 0;
}
7-56 换硬币
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int cnt=0,Cnt=0;
for(int i=n/5;i>=1;i--){
for(int j=n/2;j>=1;j--){
int k=n-i*5-j*2;
if(k>=1 && i*5+j*2+k==n){
Cnt++;
cnt=i+j+k;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,cnt);
}
}
}
printf("count = %d",Cnt);
return 0;
}
7-57 水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1 ^3 + 5 ^3 + 3 ^3
本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
// 预计算每一个数字的n次方
int powers[10];
for (int i = 0; i < 10; i++)
powers[i] = pow(i, n);
// 确定下限和上限
int lower_limit = pow(10,n-1);
int upper_limit = pow(10,n);
for (int i = lower_limit; i < upper_limit; i++) {
int sum = 0;
int temp = i;
while (temp) {
int digit = temp % 10;
sum += powers[digit];
temp /= 10;
}
if (sum == i)
printf("%d\n", i);
}
return 0;
}
7-58 最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
a和b的最大公约数和最小公倍数:
最大公约数 - b等于0时a的值
最小公倍数 (a*b)/最大公约数
#include <stdio.h>
int gys(int a,int b){
int temp;
while(b!=0){
temp=b;
b=a%b;
a=temp;
}
return a;
}
int gbs(int a,int b){
return (a*b)/gys(a,b);
}
int main(){
int a,b;scanf("%d %d",&a,&b);
int ans1=gys(a,b);
int ans2=gbs(a,b);
printf("%d %d",ans1,ans2);
return 0;
}
7-59 高空坠球
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
注意:n为 0 时表示球未开始下落。
输入样例:
33 5
输出样例:
94.9 1.0
// 皮球的初始高度和n
// 在第n次落地时,在空中一共经过多少距离?
// 第n次反弹的高度是多少?
// h h/2;h/2 h/2*(1/2)
#include <stdio.h>
int main(){
double h,n;scanf("%lf %lf",&h,&n);
double temp=h;
double sum=0;
if(n==0) printf("0.0 0.0");
else{
for(int i=1;i<=n;i++){ // 方法1.
sum+=1.5*h;
h/=2.0;
}
printf("%.1f %.1f",sum-h,h);
// for(int i=1;i<=n-1;i++){ // 方法2.
// temp/=2.0;
// sum+=temp*2;
// }
// sum=sum+h;
// printf("%.1f %.1f",sum,temp/2.0);
}
return 0;
}
7-60 打印菱形图案
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include <stdio.h>
// 上半区 4行;空格为 3 2 1 0;图形为 1 3 5 7
// 下半区 3行;空格为 1 2 3;图形为 5 3 1
int main(){
int n;scanf("%d",&n);
int kg=n/2,tx=1;
// 1.上半区
for(int i=0;i<=n/2;i++){
for(int j=0;j<kg;j++) printf(" ");
for(int k=0;k<tx;k++) printf("* ");
printf("\n");
kg-=1;
tx+=2;
}
// 2.下半区
kg=1,tx=2*(n/2)-1;
for(int i=0;i<n/2;i++){
for(int j=0;j<kg;j++) printf(" ");
for(int k=0;k<tx;k++) printf("* ");
printf("\n");
kg+=1;
tx-=2;
}
return 0;
}
7-61 猴子吃桃问题
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
// eat=x/2+1
// eat=(x-eat)/2+1
// x-eat=1
// 从第二天开始,满足方程 x-(x/2+1)=昨天,即
// x=2*(昨天+1)
#include <stdio.h>
int main(){
int n;scanf("%d",&n);// 天数
int sum=1;
for(int i=2;i<=n;i++){
sum=2*(sum+1);
}
printf("%d",sum);
return 0;
}