7-1 求奇数和
作者 C课程组
单位 浙江大学
本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
解答:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int sum=0;
for(int i=1; ;i++)
{
cin>>i;
if(i<=0)
break;
if(i%2==1)
{
sum=sum+i;
}
}
cout<<sum<<endl;
return 0;
}
7-2 求整数的位数及各位数字之和
作者 C课程组
单位 浙江大学
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个不超过109的正整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
321
输出样例:
3 6
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int count=0;
int sum=0;
while(n>0)
{
count++;
sum=sum+n%10;
n=n/10;
}
cout<<count<<" "<<sum<<endl;
return 0;
}
7-3 最大公约数和最小公倍数
作者 张彤彧
单位 浙江大学
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
if(m>n)
{
int temp=m;
m=n;
n=temp;
}
int max,min;
for(int i=n; ;i++)
{
if(i%n==0&&i%m==0)
{
max=i;
break;
}
}
for(int i=m;i>=1;i--)
{
if(m%i==0&&n%i==0)
{
min=i;
break;
}
}
cout<<min<<" "<<max<<endl;
return 0;
}
7-4 统计素数并求和
作者 张彤彧
单位 浙江大学
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n,i,j;
cin>>m>>n;
int count=0,sum=0;
for(i=m;i<=n;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
{
break;
}
}
if(i==j)
{
count++;
sum+=i;
}
}
cout<<count<<" "<<sum<<endl;
return 0;
}
7-5 猜数字游戏
作者 C课程组
单位 浙江大学
猜数字游戏是令游戏机随机产生一个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
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int number,N,guess;
cin>>number>>N;
int count = 0;
while(1)
{
cin>>guess;
count++;
if(count>N||guess<0)
{
cout<<"Game Over";
break;
}
else if(guess==number)
{
if(count==1) cout<<"Bingo!";
else if(count<=3) cout<<"Lucky You!";
else if(count>3&&count<=N) cout<<"Good Guess!";
break;
}
else
{
if(guess>number) cout<<"Too big"<<endl;
else cout<<"Too small"<<endl;
}
}
return 0;
}
7-6 兔子繁衍问题
作者 徐镜春
单位 浙江大学
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a=1,b=1;
int c;
int count=2;
if(n==1)
{
cout<<"1"<<endl;
}
else
{
while(1)
{
c=a+b;
a=b;
b=c;
count++;
if(b>=n)
{
break;
}
}
}
cout<<count<<endl;
return 0;
}
7-7 高空坠球
作者 C课程组
单位 浙江大学
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
注意:n为 0 时表示球未开始下落。
输入样例:
33 5
输出样例:
94.9 1.0
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h,n;
scanf("%d %d",&h,&n);
double sum = 0,height = 0;
for(int i = 1;i<=n;i++)
{
if(i==1)
sum = sum + h;
else
sum = sum + 2*height;
height = h/pow(2,i);
}
printf("%.1f %.1f",sum,height);
return 0;
}
7-8 打印九九口诀表
作者 徐镜春
单位 浙江大学
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数N
,输出从1*1
到N*N
的部分口诀表。
输入格式:
输入在一行中给出一个正整数N
(1≤N
≤9)。
输出格式:
输出下三角N*N
部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int i=1,j=1;
scanf("%d",&n);
for (i=1; i<=n; i++)
{
for (j=1; j<=i; j++)
{
printf("%d*%d=%-4d",j,i,i*j);
if(i==j){ printf("\n");}
}
}
return 0;
}
7-9 穷举问题-搬砖
分数 10
全屏浏览题目
切换布局
作者 杨起帆
单位 浙大城市学院
某工地需要搬运砖块,已知男人一人搬3
块,女人一人搬2
块,小孩两人搬1
块。如果想用n
人正好搬n
块砖,问有多少种搬法?
输入格式:
输入在一行中给出一个正整数n
。
输出格式:
输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c
"的格式,输出男人的数量cnt_m
,女人的数量cnt_w
,小孩的数量cnt_c
。请注意,等号的两侧各有一个空格,逗号的后面也有一个空格。
如果找不到符合条件的方案,则输出"None
"
输入样例:
45
输出样例:
men = 0, women = 15, child = 30
men = 3, women = 10, child = 32
men = 6, women = 5, child = 34
men = 9, women = 0, child = 36
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int cnt_m = 0;
int cnt_w = 0;
float cnt_c = 0;
int count = 0;
for(cnt_m = 0;cnt_m<=n;cnt_m++)
{
for(cnt_w = 0;cnt_w<=n;cnt_w++)
{
for(cnt_c = 0;cnt_c<=n;cnt_c++)
{
if((cnt_m+cnt_w+cnt_c == n)&&(cnt_m*3+cnt_w*2+cnt_c*0.5==n))
{
count++;
printf("men = %d, women = %d, child = %.0f\n",cnt_m,cnt_w,cnt_c);
}
}
}
}
if(count == 0)
{
printf("None");
}
return 0;
}
7-10 用格里高利公式求给定精度的PI值
作者 颜晖
单位 浙大城市学院
本题要求编写程序,计算序列部分和 4∗(1−1/3+1/5−1/7+...) ,直到最后一项的绝对值小于给定精度eps
。
输入格式:
输入在一行中给出一个正实数eps
。
输出格式:
在一行中按照“Pi = pi
”的格式输出部分和的值pi
,精确到小数点后四位。题目保证输入数据和计算结果均不超过双精度范围。
输入样例1:
0.0001
输出样例1:
Pi = 3.1418
输入样例2:
0.2
输出样例2:
Pi = 2.8952
解答:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int denominator=1;
double pi=0.0,flag=1.0;
double eps,item=1.0;
cin>>eps;
if(eps<=1)
{
while(fabs(item)>=eps)
{
item = flag/denominator;
pi = pi + item;
flag = -flag;
denominator = denominator + 2;
}
printf("Pi = %.4lf\n",pi*4);
}
else
{
pi = 1;
printf("Pi = %.4lf\n",pi*4);
}
return 0;
}