跳转至

Contest 3 & Contest 4

求奇数和
Description
输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程序。
Input
输入一批正整数(以零或负数为结束标志)并用零或负数结尾
Output
输出其奇数的和(整数形式)。
Sample Input 1 
1 2 5 6 3 4 0
Sample Output 1
9
#include <stdio.h>
int main(){
    int a,ans=0;
    while(1){
        scanf("%d",&a);
        if(a<=0)break;
        if(a%2)ans+=a;
    }
    printf("%d",ans);
    return 0;
}
展开式求和
Description
输入一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.00001,计算结果保留四位小数。
要求定义和调用函数fact(n)计算n的阶乘,可以调用pow()函数求幂。试编写相应程序。
S= 1+x+x^2/2! + x^3/3! + x^4/4! +……
Input
输入一个实数x(double类型)
Output
输出序列求和的值,double类型,结果保留4位小数。
Sample Input 1 
1
Sample Output 1
2.7183
#include <stdio.h>
#include <math.h>
double x,ans,tmp;
int main(){
    tmp=1.0f;
    scanf("%lf",&x);
    ans+=1.0f;
    for(int i=1;;i++){
        tmp*=i;
        ans+=pow(x,i)/tmp;
        if(fabs(pow(x,i)/tmp)<0.00001f)break;
    }
    printf("%.4lf",ans);
    return 0;
}
求序列和
Description
输入一个整数n,输出2/1+3/2+5/3+8/5+……的前n项之和,保留2位小数,该序列从第二项起,每一项的分子是前一项分子与分母的和,
分母是前一项的分子。试编写相应的程序。
Input
输入一个整数n
Output
输出序列和,double类型,结果保留两位小数
Sample Input 1 
2
Sample Output 1
3.50
#include <stdio.h>
#include <math.h>
int n,tmp1,tmp2,tmp3;
double ans;
int main(){
    scanf("%d",&n);
    tmp1=2;tmp2=1;
    ans=2.0f;
    for(int i=2;i<=n;i++){
        tmp3=tmp2;
        tmp2=tmp1;
        tmp1=tmp1+tmp3;
        ans+=(double) tmp1/tmp2;
    }
    printf("%.2lf",ans);
    return 0;
}
序列求和
Description
输入两个正整数a和n,求a+aa+aaa+aa...a(n个a)之和。试编写相应程序。
Input
输出两个正整数a和n
Output
输出序列之和
Sample Input 1 
2 3
Sample Output 1
246
#include <stdio.h>
#include <math.h>
int a,n,tmp,ans;
int main(){
    scanf("%d%d",&a,&n);
    tmp=a;
    for(int i=1;i<=n;i++){
        ans+=tmp;
        tmp=10*tmp+a;
    }
    printf("%d",ans);
    return 0;
}
换硬币
Description
将一笔零钱(大于8分,小于1元,精确到分),换成5分、2分和1分的硬币,每种硬币至少有一枚。
输入金额,问有几种换法,输出有多少种换法。试编写相应程序。
Input
输入整数金额(单位分),金额范围:8~100分
Output
输出有多少种换法
Sample Input 1 
9
Sample Output 1
1
#include <stdio.h>
int main()
{
    int n;
    int x,y,z;
    int num=0;
    scanf("%d",&n);
    for(x=1;x<=n;x++)
        for(y=1;y<=n/2;y++)
            for(z=1;z<=n/5;z++){
                if(x+2*y+5*z==n)num++;
            }
    printf("%d",num);
}
输出水仙花数数量
Description
输入一个正整数n(3<=n<=7),输出所有n位水仙花数。水仙花数是指一个n位正整数,它的各位数字是n次幂之和等于它本身,输出n位所有水仙花数数量。试编写相应程序。
例如:153各位数字的立方和是1^3+5^3+3^3=153。
Input
输入一个正整数n
Output
输出n位所有水仙花数数量
Sample Input 1 
3
Sample Output 1
4
#include <stdio.h>
int n;
int a,b,tmp,tmp1,ans=0;
int f[10][10];
int main(){
    scanf("%d",&n);
    a=1;
    for(int i=1;i<=9;i++)f[i][1]=i;
    for(int i=1;i<=9;i++){
        for(int j=2;j<=9;j++)f[i][j]=f[i][j-1]*i;
    }
    for(int i=1;i<n;i++)a*=10;
    b=a*10;
    for(int i=a;i<b;i++){
        tmp=i;tmp1=0;
        while(tmp){
            tmp1+=f[tmp%10][n];
            tmp/=10;
        }
        if(tmp1==i)ans++;
    }
    printf("%d",ans);
}
求最大公约数和最小公倍数
Description
输入两个正整数m和n(m<=1000,n<=1000),求其最大公约数和最小公倍数,试编写相应程序。
Input
输入两个整数m 和 n(m<=1000,n<=1000).
Output
输出其最大公约数和最小公倍数,输出用一个空格隔开。
Sample Input 1 
15 25
Sample Output 1
5 75
#include <stdio.h>
int m,n,g;
int gcd(int x,int y){
    return (y==0)?(x):gcd(y,x%y);
}
int main(){
    scanf("%d%d",&m,&n);
    g=gcd(m,n);
    printf("%d %d",g,m*n/g);
    return 0;
}
高空坠球
Description
皮球从height(米)高度自由落下,触地后反弹到原高度的一半再落下,再反弹…… 如此反复。问皮球在n次反弹的高度是多少?输出保留2位小数,试编写相应程序。
Input
输入下放高度height(米)和 n 次反弹。
Output
输出n次反弹的高度(米),保留2位小数,输出为double类型
Sample Input 1 
8 4
Sample Output 1
0.50
#include <stdio.h>
int n;
double h;
double ans=1.0f;
double qpow(double x,int n){
    if(n==0)return 1.0f;
    else if(n%2) return qpow(x,n-1)*x;
    else return qpow(x*x,n/2);
}
int main(){
    scanf("%lf%d",&h,&n);
    ans=h*qpow(0.5,n);
    printf("%.2lf",ans);
    return 0;
}
打印菱形星号“*”图案
Description
输入一个正整数n(n为奇数),打印一个高度为n的“*”菱形图案。试编写相应程序。
Input
输入一个整数 n
Output
打印一个高度为n的棱形图案,非 “*” 号区域用空格字符填充,上下行之间并无空行。
Sample Input 1 
7
Sample Output 1

   *
  ***
 *****
*******
 *****
  ***
   *
#include <stdio.h>
int main(void) { 
    int n;
    scanf("%d",&n);
    n=n/2;
    int i,j,k;

    for(i = 1; i <= n; i++){
        for(j = 1; j <= n - i+1; j++){
            printf(" ");
        }
        for(k = 1; k <= 2*i-1; k++){
            printf("*");
        }
        printf("\n");
    } 
    for(int i=1;i<=2*n+1;i++)printf("*");
    printf("\n");
    for(i = 1; i <= n; i++){
        for(j = 1; j <= i; j++){
            printf(" ");
        }
        for(k = 1; k <= 2*n-(2*i-1); k++){
            printf("*");
        }
        printf("\n");
    }

    return 0;
}
猴子吃桃问题
Description
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,多吃了一个;第二天早上又将剩下桃子吃掉一半,又多吃了一个。
以后每天早上都是了前一天剩下的一半加一个。到第n天早上想再吃时就只剩下一个桃子了。问:第一天一共摘了多少个桃子?
试编写相应程序(提示:采取逆向思维的方法,从后往前判断)
Input
输入正整数n,表示第n天。
Output
输出桃子个数。
Sample Input 1 
10
Sample Output 1
1534
#include<stdio.h>
int f(int N){
    int t=1;
    for(int i=N-1;i>=1;i--){
        t=2*(t+1);
    }
    return t;
}
int main(){
    int N;
    scanf("%d",&N);
    printf("%d",f(N));
    return 0;
}
兔子繁衍问题
Description
一对兔子,从出生后第三个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,
请问第一个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10000的正整数n,输出兔子总数达到n最少需要的月数。试编写相应程序。
Input
输入比较的整数对n
Output
输入达到 n 最少需要的月数。
Sample Input 1 
5
Sample Output 1
5
#include <stdio.h>
int n,ans;
int a[666];
int main(){
    scanf("%d",&n);
    a[1]=1;
    if(n==0)ans=1;
    else if(n==1)ans=1;
    else{
        for(int i=2;;i++){
            a[i]=a[i-1]+a[i-2];
            if(a[i]>=n){
                ans=i;
                break;
            }
        }
    }
    printf("%d",ans);
}