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