信息学奥赛一本通 第四章
第一节 for循环
2016:【例4.1】for循环求和
【题目描述】
利用for循环。计算输出1+2+3+...+n的和。
【输入】
输入n。
【输出】
如题述,之和。
【输入样例】
10
【输出样例】
55
【提示】
【数据规模及约定】
对于100%的数据,1≤n≤100。
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int s=0;
for(int i=1;i<=n;i++)
{
s=s+i;
}
cout<<s;
return 0;
}
2017:【例4.2】输出偶数
【题目描述】
按照由小到大的顺序,输出1∼n之间的所有偶数。
【输入】
输入n。
【输出】
输出为一行,各个偶数之间用一个空格隔开。
【输入样例】
10
【输出样例】
2 4 6 8 10
【提示】
【数据规模及约定】
对于所有数据,1≤n≤100。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
if(i%2==0) cout<<i<<" ";
}
return 0;
}
2018:【例4.3】输出奇偶数之和
【题目描述】
利用for循环,分别输出1∼n之间的所有奇数的和、偶数的和。
【输入】
输入n。
【输出】
输出为一行,两个数(用一个空格隔开),偶数之和与奇数之和。
【输入样例】
10
【输出样例】
30 25
【提示】
【数据规模及约定】
对于所有数据,1≤n≤100。
#include <iostream>
using namespace std;
int main()
{
int n;
int sum1=0,sum2=0;
cin>>n;
for(int i=0;i<=n;i++)
{
if(i%2==0) sum1=sum1+i;
else sum2=sum2+i;
}
cout<<sum1<<" "<<sum2;
return 0;
}
2019:【例4.4】求阶乘
【题目描述】
利用for循环求n!
的值。
提示,n!=1×2×...×n
。
【输入】
输入一个正整数n
。
【输出】
输出n!
的值。
【输入样例】
4
【输出样例】
24
【提示】
【数据规模及约定】
对于所有数据,1≤n≤20。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long s=1;
for(int i=1;i<=n;i++)
{
s=s*i;
}
cout<<s;
return 0;
}
1059:求平均年龄
【题目描述】
班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。
【输入】
第一行有一个整数n
(1≤n≤100
),表示学生的人数。其后n
行每行有1
个整数,表示每个学生的年龄,取值为15
到25
。
【输出】
输出一行,该行包含一个浮点数,为要求的平均年龄,保留到小数点后两位。
【输入样例】
2
18
17
【输出样例】
17.50
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,i,a;
float sum=0;
float av;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum=sum+a;
}
printf("%.2f",sum/n);
return 0;
}
1060:均值
【题目描述】
给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。
【输入】
输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的浮点数,代表各个样本数据。
【输出】
输出一行,包含一个浮点数,表示均值,精确到小数点后4位。
【输入样例】
2
1.0 3.0
【输出样例】
2.0000
#include<iostream>
using namespace std;
int main(){
int N;
double sum,n;
cin>>N;
for(int i=1;i<=N;i++){
cin>>n;
sum=sum+n;
}
sum=sum/N;
printf("%.4f",sum);
return 0;
}
1061:求整数的和与均值
【题目描述】
读入n(1≤n≤10000)个整数,求它们的和与均值。
【输入】
输入第一行是一个整数n,表示有n个整数。
第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。
【输出】
输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。
【输入样例】
4
344
222
343
222
【输出样例】
1131 282.75000
#include<cstdio>
using namespace std;
int n,m,i,t;
double s=0;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&m);
s=s+m;
}
t=s;
printf("%d",t);
printf(" %.5lf",s/n);
return 0;
}
1062:最高的分数
【题目描述】
孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决这个问题吗?
【输入】
输入两行,第一行为整数n(1 <= n < 100),表示参加这次考试的人数.第二行是这n个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为0到100之间的整数。
【输出】
输出一个整数,即最高的成绩。
【输入样例】
5
85 78 90 99 60
【输出样例】
99
#include<iostream>
using namespace std;
int main()
{
int a,b,max=0;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;
if(b>max) max=b;
}
cout<<max;
return 0;
}
1063:最大跨度值
【题目描述】
给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值)。
【输入】
一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。
【输出】
输出一行,表示序列的最大跨度值。
【输入样例】
6
3 0 8 7 5 9
【输出样例】
9
#include<iostream>
using namespace std;
int main()
{
int a,b,max=0,min=10000;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;
if(b>max) max=b;
if(b<min) min=b;
}
cout<<max-min;
return 0;
}
1064:奥运奖牌计数
【题目描述】
2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目。输出4个整数,为A国所获得的金、银、铜牌总数及总奖牌数。
【输入】
输入n+1行,第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。
【输出】
输出1行,包括4个整数,为A国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。
【输入样例】
3
1 0 3
3 1 0
0 3 0
【输出样例】
4 4 3 11
#include<iostream>
using namespace std;
int main()
{
int a,j,y,t,j1=0,y1=0,t1=0;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>j>>y>>t;
j1+=j;
y1+=y;
t1+=t;
}
cout<<j1<<" "<<y1<<" "<<t1<<" "<<j1+y1+ti;
return 0;
}
1065:奇数求和
【题目描述】
计算非负整数m
到n
(包括m
和n
)之间的所有奇数的和,其中,m
不大于 n
,且n
不大于300
。例如 m=3,n=12
, 其和则为:3+5+7+9+11=35
。
【输入】
两个数 m
和 n
,两个数以一个空格分开,其中 0≤m≤n≤300
。
【输出】
输出一行,包含一个整数,表示m
到 n
(包括m
和 n
)之间的所有奇数的和
【输入样例】
7 15
【输出样例】
55
#include<iostream>
using namespace std;
int main()
{
int a,b,sum=0;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
if(i%2==1) sum+=i;
}
cout<<sum;
return 0;
}
1066:满足条件的数累加
【题目描述】
将正整数m
和n
之间(包括m
和n
)能被17
整除的数累加,其中,0<m<n<1000
。
【输入】
一行,包含两个整数m
和n
,其间,以一个空格间隔。
【输出】
输出一行,包行一个整数,表示累加的结果。
【输入样例】
50 85
【输出样例】
204
#include<iostream>
using namespace std;
int main()
{
int a,b,sum=0;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
if(i%17==0) sum+=i;
}
cout<<sum;
return 0;
}
1067:整数的个数
【题目描述】
给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。
【输入】
输入有两行:第一行包含一个正整数k,第二行包含k个正整数,每两个正整数用一个空格分开。
【输出】
输出有三行,第一行为1出现的次数,第二行为5出现的次数,第三行为10出现的次数。
【输入样例】
5
1 5 8 10 5
【输出样例】
1
2
1
#include<iostream>
using namespace std;
int main()
{
int a,b,o=0,f=0,t=0;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;
if(b==1)
{
o+=1;
}
if(b==5)
{
f+=1;
}
if(b==10)
{
t+=1;
}
}
cout<<o<<endl<<f<<endl<<t;
return 0;
}
1068:与指定数字相同的数的个数
【题目描述】
输出一个整数序列中与指定数字相同的数的个数。输入包含2行:第1行为N和m,表示整数序列的长度(N<=100)和指定的数字;第2行为N个整数,整数之间以一个空格分开。输出为N个数中与m相同的数的个数。
【输入】
第1行为N和m,表示整数序列的长度(N<=100)和指定的数字, 中间用一个空格分开;
第2行为N个整数,整数之间以一个空格分开。
【输出】
输出为N个数中与m相同的数的个数。
【输入样例】
3 2
2 3 2
【输出样例】
2
#include <stdio.h>
int main()
{
int n,m,i,a[100],cnt=0;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
if(a[i]==m)
cnt++;
printf("%d\n",cnt);
return 0;
}
1069:乘方计算
【题目描述】
给出一个整数a
和一个正整数n(−1000000≤a≤1000000,1≤n≤10000)
,求乘方an
,即乘方结果。最终结果的绝对值不超过1000000
。
【输入】
一行,包含两个整数a
和n
。−1000000≤a≤1000000,1≤n≤10000
。
【输出】
一个整数,即乘方结果。题目保证最终结果的绝对值不超过1000000
。
【输入样例】
2 3
【输出样例】
8
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int main()
{
int n,i,m,k=1;
cin>>n>>m;
for(i=1;i<=m;i++)
k=k*n;
printf("%d",k);
return 0;
}
1070:人口增长
【题目描述】
我国现有x亿人口,按照每年0.1%的增长速度,n年后将有多少人?保留小数点后四位。
【输入】
一行,包含两个整数x和n,分别是人口基数和年数,以单个空格分隔。
【输出】
输出最后的人口数,以亿为单位,保留到小数点后四位。1<=x<=100,1<=n<=100。
【输入样例】
13 10
【输出样例】
13.1306
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int main()
{
float n;
int i,m;
cin>>n>>m;
for(i=1;i<=m;i++)
n=n+n*0.001;
printf("%.4f",n);
return 0;
}
1071:菲波那契数
【题目描述】
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求菲波那契数列中第k个数是多少。
【输入】
输入一行,包含一个正整数k。(1 ≤ k ≤ 46)
【输出】
输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小。
【输入样例】
19
【输出样例】
4181
#include<iostream>
using namespace std;
int main()
{
int k;
cin >> k;
int a = 1;
int b = 1;
int c;
if (k <= 2)
{
cout << "1";
}
else
{
for (int i = 3; i <=k; ++i)
{
c = a + b;
a = b;
b=c;
}
cout << b;
}
}
1072:鸡尾酒疗法
【题目描述】
鸡尾酒疗法,指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。
【输入】
第一行为整数n(1<n<=20);其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。
【输出】
有n-1行输出,分别表示对应改进疗法的效果:如果效果更好,输出better;如果效果更差,输出worse;否则输出same。
【输入样例】
5
125 99
112 89
145 99
99 97
123 98
【输出样例】
same
worse
better
same
#include <iostream>
using namespace std;
int main(){
int n;
double x1,x2,y1,y2;
cin>>n>>x1>>x2;
double x=x2/x1,y;
for (int i = 2; i <= n; i++){
cin>>y1>>y2;
y=y2/y1;
if (y-x>0.05){
cout<<"better"<<endl;
}else{
if (x - y > 0.05){
cout<<"worse"<<endl;
}else{
cout<<"same"<<endl;
}
}
}
}
1075:药房管理
【题目描述】
随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医疗过程中,从而极大地提高了医院整体的工作效率。
对药品的管理是其中的一项重要内容。现在药房的管理员希望使用计算机来帮助他管理。假设对于任意一种药品,每天开始工作时的库存总量已知,并且一天之内不会通过进货的方式增加。每天会有很多病人前来取药,每个病人希望取走不同数量的药品。如果病人需要的数量超过了当时的库存量,药房会拒绝该病人的请求。管理员希望知道每天会有多少病人没有取上药。
【输入】
共3行,第一行是每天开始时的药品总量m。
第二行是这一天取药的人数n(0<n<=100)。
第三行共有n个数,分别记录了每个病人希望取走的药品数量(按照时间先后的顺序)。
【输出】
只有1行,为这一天没有取上药品的人数。
【输入样例】
30
6
10 5 20 6 7 8
【输出样例】
2
#include<cstdio>
int a,n,m,k,t;
using namespace std;
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&k);
if(k>m)
t=t+1;
else
m=m-k;
}
printf("%d",t);
return 0;
}
1076:正常血压
【题目描述】
监护室每小时测量一次病人的血压,若收缩压在90-140之间并且舒张压在60-90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
【输入】
第一行为一个正整数n(n<100),其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压。
【输出】
输出仅一行,血压连续正常的最长小时数。
【输入样例】
4
100 80
90 50
120 60
140 90
【输出样例】
#include <stdio.h>
int main()
{
int i,n,cnt=0,max=0;
int low,high;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&high,&low);
if((high>=90 && high<=140) && (low>=60 && low<=90))
cnt++;
else
cnt=0;
if(cnt>max)
max=cnt;
}
printf("%d\n",max);
return 0;
}
1077:统计满足条件的4位数
【题目描述】
给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字的结果大于零。
【输入】
输入为两行,第一行为四位数的个数n,第二行为n个的四位数。(n<=100)
【输出】
输出为一行,包含一个整数,表示满足条件的四位数的个数。
【输入样例】
5
1234 1349 6119 2123 5017
【输出样例】
3
#include<bits/stdc++.h>
using namespace std;
bool isOk(int n)
{
int d = n % 10;
n /= 10;
while(n > 0)
{
d -= n % 10;
n /= 10;
}
return d > 0;
}
int main()
{
int n, s = 0;
cin>>n;
for(int i = 0; i < n; ++i)
{
int a;
cin>>a;
if(isOk(a))
s++;
}
cout<<s;
return 0;
}
1078:求分数序列和
【题目描述】
有一个分数序列 q1p1,q2p2,q3p3,q4p4,q5p5,....
,其中qi+1=qi+pi
, pi+1=qi,p1=1,q1=2
。比如这个序列前6
项分别是21,32,53,85,138,2113
。求这个分数序列的前n
项之和。
【输入】
输入有一行,包含一个正整数n(n≤30)
。
【输出】
输出有一行,包含一个浮点数,表示分数序列前n
项的和,精确到小数点后4
位。
【输入样例】
2
【输出样例】
3.5000
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,a;
float sum=0.000,q=2.0,p=1.0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
sum=sum+q/p;
a=q;
q=p+q;
p=a;
}
printf("%.4f",sum);
return 0;
}
1079:计算分数加减表达式的值
【题目描述】
编写程序,输入n
的值,求11−12+13−14+15−16+17−18+...+(−1)n−1⋅1n
的值。
【输入】
输入一个正整数n
。(1<=n<=1000)
【输出】
输出一个实数,为表达式的值,保留到小数点后四位。
【输入样例】
2
【输出样例】
0.5000
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
double s = 0;
int n, sign = 1;
cin>>n;
for(int i = 1; i <= n; ++i)
{
s += (double)sign * 1 / i;
sign = -sign;
}
cout<<fixed<<setprecision(4)<<s;
return 0;
}
1080:余数相同问题
【题目描述】
已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。
请问满足上述条件的x的最小值是多少?数据保证x有解。
【输入】
一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。
【输出】
一个整数,即满足条件的x的最小值。
【输入样例】
300 262 205
【输出样例】
19
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
int x, a, b, c;
cin >> a >> b >> c;
for(x = 2; x <= 1000000; ++x)
{
if(a%x == b%x && b%x == c%x)
{
cout << x;
break;
}
}
return 0;
}
1081:分苹果
【题目描述】
把一堆苹果分给n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个?
【输入】
一个不大于1000的正整数n,代表小朋友人数。
【输出】
一个整数,表示满足条件的最少苹果个数。
【输入样例】
8
【输出样例】
36
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int main()
{
int i,p,k,q,n=0;
cin>>k;
for(i=1;i<=k;i++){
n=n+i;
}
cout<<n;
return 0;
}
1082:求小数的某一位
【题目描述】
分数ab
化为小数后,小数点后第n
位的数字是多少?
【输入】
三个正整数a,b,n
,相邻两个数之间用单个空格隔开。0<a<b<100,1<=n<=10000
。
【输出】
一个数字。
【输入样例】
1 2 1
【输出样例】
5
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b, n, d;
cin >> a >> b >> n;
int r = a % b;
for(int i = 1; i <= n; ++i)
{
r *= 10;
d = r / b;
r %= b;
}
cout << d;
return 0;
}
1083:计算星期几
【题目描述】
假设今天是星期日,那么过ab
天之后是星期几?
【输入】
两个正整数a
,b
,中间用单个空格隔开。0<a≤100,0<b≤10000
。
【输出】
一个字符串,代表过ab
天之后是星期几。
其中,Monday是星期一,Tuesday是星期二,Wednesday是星期三,Thursday是星期四,Friday是星期五,Saturday是星期六,Sunday是星期日。
【输入样例】
3 2000
【输出样例】
Tuesday
#include<iostream>
using namespace std;
int main()
{
#include<math.h>
using namespace std;
int main()
{
int i,j,k,m=1;
cin>>j>>k;
for(i=1;i<=k;i++)
{m*=j;
m%=7;}
switch(m)
{
case 1:cout<<"Monday";break;
case 2:cout<<"Tuesday";break;
case 3:cout<<"Wednesday";break;
case 4:cout<<"Thursday";break;
case 5:cout<<"Friday";break;
case 6:cout<<"Saturday";break;
case 0:cout<<"Sunday";break;
}
return 0;
}
}
1084:幂的末尾
【题目描述】
幂ab
的末3
位数是多少?
【输入】
两个正整数a,b
。1≤a≤100,1≤b≤10000
。
【输出】
从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。
【输入样例】
7 2011
【输出样例】
743
#include "stdio.h"
int main(){
int x, n;
scanf("%d%d", &x, &n);
int rst = x;
for(int i=0; i<n-1; i++){
rst *= x;
rst %= 1000;
}
if(rst == 0) printf("000");
else if(rst < 10) printf("00%d", rst);
else if(rst < 100) printf("0%d", rst);
else printf("%d", rst);
return 0;
}
2020:【例4.5】第几项
【题目描述】
对于正整数n,m
,求s=1+2+3……+n
,当加到第几项时,s
的值会超过m
?
【输入】
输入m
。
【输出】
输出n
。
【输入样例】
1000
【输出样例】
45
【提示】
【数据范围】
对于全部数据:1≤m≤40000
。
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int a,b=0,c=0,i=1;
cin>>a;
while(true){
b+=i;
i++;
c++;
if(b>=a) break;
}
cout<<c<<endl;
return 0;
}
2021:【例4.6】最大公约数
【题目描述】
求两个正整数m
,n
的最大公约数。
【输入】
输入m
,n
。
【输出】
m
,n
的最大公约数。
【输入样例】
4 6
【输出样例】
2
【提示】
【数据范围】
对于全部数据:m,n<4000000
。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
for(int i=m;i>=1;i--)
{
if((m%i==0)&&(n%i==0))
{
cout<<i;
break;
}
}
return 0;
}
2023:【例4.8】数据统计
【题目描述】
输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。
【输入】
一行,若干个整数。
【输出】
一行,即,最小值、最大值和平均值(保留3位小数)。
【输入样例】
1 2 3
【输出样例】
1 3 2.000
【提示】
【数据范围】
数据个数不超过100
。
#include<iostream>
using namespace std;
#include<cstdio>
int main()
{
int x,n=0,min=1000,max=-9999;
double s=0;
while(scanf("%d",&x)==1)
{
s=s+x;
if(x<min)
{
min=x;
}
if(x>max)
{
max=x;
}
n++;
}
printf("%d %d %.3f",min,max,s/n);
return 0;
}
1085:球弹跳高度的计算
【题目描述】
一球从某一高度h
落下(单位米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第10
次落地时,共经过多少米? 第10
次反弹多高?
输出包含两行,第1行:到球第10
次落地时,一共经过的米数。第2行:第10
次弹跳的高度。
【输入】
输入一个整数h
,表示球的初始高度。
【输出】
第1行:到球第10
次落地时,一共经过的米数。
第2行:第10
次弹跳的高度。
注意:结果可能是实数,结果用double类型保存。
提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("\%g",ANSWER)即可。
【输入样例】
20
【输出样例】
59.9219
0.0195312
我们得知道,上下是一个来回,所以要加两次。
#include<iostream>
using namespace std;
int main()
{
double h,sum=0,s; //双精度变量
cin>>h; //输入h
s=h; //保存这个值
for(int i=1;i<=10;i++)
{
sum+=h; //h加进总和
h/=2; //h缩小两倍
}
cout<<sum+s-h*2<<endl<<h; //输出经过路程,最后高度
return 0;
}
1086:角谷猜想
【题目描述】
谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3
加1
,如果是偶数,则除以2
,得到的结果再按照上述规则重复处理,最终总能够得到1
。如,假定初始整数为5
,计算过程分别为16
、8
、4
、2
、1
。程序要求输入一个整数,将经过处理得到1
的过程输出来。
【输入】
一个正整数n
(n≤2,000,000
)。
【输出】
从输入整数到1
的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1
,直接输出"End"。
【输入样例】
5
【输出样例】
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
【提示】
no
这个要判断奇偶,所以要用到 if( ).
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
while(a!=1)
{
if(a%2==1)
{
cout<<a<<"*3+1="<<a*3+1<<endl;
a=a*3+1;
}
if(a%2==0)
{
cout<<a<<"/2="<<a/2<<endl;
a/=2;
}
}
cout<<"End"<<endl;
return 0;
}
2024:【例4.10】末两位数
【题目描述】
求n
个1992
的乘积的末两位数是多少?
【输入】
输入n
。
【输出】
如题述的末两位数。
【输入样例】
3
【输出样例】
88
【提示】
【数据范围】
对于所有数据:n<2000
。
积的后两位只与乘数的后两位有关
#include<iostream>
using namespace std;
int main()
{
int a=1,i,n;
cin>>n;
i=n;
do
{
i--;
a=a*92;
a%=100;
}while(i>0);
cout<<a;
return 0;
}
2025:【例4.11】体操队
【题目描述】
校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少多少人?
【输入】
如题述,无。
【输出】
校体操队人数。
例如:人数为15,直接输出15就可以啦。
【输入样例】
无
【输出样例】
无
就余数的知识
#include<iostream>
using namespace std;
int main()
{
int a,i=1;
do
{
if(i%2==1&&i%3==1&&i%4==1&&i%5==1&&i%6==1&&i%7==0)
{
cout<<i;
break;
}
i++;
}while(i>=0);
return 0;
}
1087:级数求和
【题目描述】
已知:Sn=1+12+13+…+1n
。显然对于任意一个整数k
,当n
足够大的时候,Sn
大于k
。现给出一个整数k(1<=k<=15)
,要求计算出一个最小的n
,使得Sn>k
。
【输入】
一个整数k
。
【输出】
一个整数n
。
【输入样例】
1
【输出样例】
2
#include<iostream>
using namespace std;
int main()
{
int a,b=1;
double c=1;
cin>>a;
while(c<=a)
{
b++;
c+=1.0/b;
}
cout<<b;
return 0;
}
1088:分离整数的各个数
【题目描述】
给定一个整数n(1≤n≤100000000)
,要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。
【输入】
输入一个整数,整数在1
到100000000
之间。
【输出】
从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。
【输入样例】
123
【输出样例】
3 2 1
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
do
{
cout<<a%10;
if(a/10)
cout<<" ";
a/=10;
}while(a);
return 0;
}
1089:数字反转
【题目描述】
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入−380
,反转后得到的新数为−83
。
【输入】
输入共 1 行,一个整数N
。
−1,000,000,000≤N≤1,000,000,000
。
【输出】
输出共 1 行,一个整数,表示反转后的新数。
【输入样例】
123
【输出样例】
321
【提示】
【输入输出样例 2】
输入:
-380
输出:
-83
#include <iostream>
using namespace std;
int main() {
int n,t=0;
cin>>n;
do
{
t=t*10+n%10;
n/=10;
}while(n);
cout<<t<<endl;
return 0;
}
1090:含k个3的数
【题目描述】
输入两个正整数m和k,其中1<m<100000,1<k<5 ,判断m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 例如,输入:43833 3,满足条件,输出YES。如果输入:39331 3,尽管有3个3,但不能被19整除,也不满足条件,应输出NO。
【输入】
m 和 k 的值,中间用单个空格间隔。
【输出】
满足条件时输出 YES,不满足时输出 NO。
【输入样例】
43833 3
【输出样例】
YES
#include<iostream>
using namespace std;
int main()
{
int m,k;
cin>>m>>k;
int n=m;
int s=0;
do
{
if(m%10==3)
{
s++;
m=m/10;
}
else
{
m=m/10;
}
}while(m);
if(n%19==0&&k==s)
{
cout<<"YES";
}
else
{
cout<<"NO";
}
return 0;
2026:【例4.12】阶乘和
【题目描述】
求 S=1!+2!+3!+....+n!
【输入】
输入正整数n
。
【输出】
输出s
。
【输入样例】
3
【输出样例】
9
【提示】
【数据范围】
对于所有数据:1≤n≤10
。
#include<iostream>
using namespace std;
int main()
{
int a,u,sum=0;
cin>>a;
for(int i=1;i<=a;i++)
{
u=1;
for(int j=1;j<=i;j++)
{
u*=j;
}
sum+=u;
}
cout<<sum;
return 0;
}
2027:【例4.13】三角形
【题目描述】
对于给定的自然数n(n<20)
,在屏幕上输出仅由“*”构成的n
行的直角三角形。
【输入】
输入n
。
【输出】
题述三角形。
【输入样例】
5
【输出样例】
*
**
***
****
*****
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cout<<"*";
}
cout<<endl;
}
return 0;
}
2029:【例4.15】水仙花数
【题目描述】
求100∼999
中的水仙花数。若三位数ABC
,ABC=A3+B3+C3
,则称ABC
为水仙花数。
例如153
,13+53+33=1+125+27=153
,则153
是水仙花数。
【输入】
无
【输出】
由小到大输出满足条件的数,每个数占一行。
假设需要输出两个数:119,100。需要输出以下形式:
100
119
【输入样例】
无
【输出样例】
无
#include<iostream>
using namespace std;
int main()
{
int g=0,s=0,b=0,sum=0;
for(int i=100;i>=100&&i<=999;i++)
{
g=i%10;
s=i/10%10;
b=i/10/10%10;
sum=g*g*g+s*s*s+b*b*b;
if(sum==i)
{
cout<<i<<endl;
}
}
return 0;
}
2030:【例4.16】找素数
【题目描述】
输出正整数a
到b
之间的所有素数。
【输入】
输入a,b
。
【输出】
由小到大,输出a
到b
之间的所有素数。每个数占一行。
【输入样例】
5 10
【输出样例】
5
7
【提示】
【数据范围】
对于所有数据,1≤a≤b≤20000
。
#include<iostream>
using namespace std;
int main()
{
int a, b;
bool isPrime;
cin >> a >> b;
for(int i = a; i <= b; ++i)
{
isPrime = true;
for(int j = 2; j <= sqrt(i); ++j)
{
if(i % j == 0)
{
isPrime = false;
break;
}
}
if(isPrime)
cout << i << endl;
}
return 0;
}
2031:【例4.17】四位完全平方数
【题目描述】
输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。
【输入】
无
【输出】
由小到大输出,每个数占一行。
【输入样例】
无
【输出样例】
无
#include<bits/stdc++.h>
using namespace std;
int main()
{
int d, num;
for(int i = 1; i <= 9; ++i)
for(int j = 0; j <= 9; ++j)
{
num = i*1000+i*100+j*10+j;
d = sqrt(num);
if(num == d*d)
cout << num << endl;
}
return 0;
}
2031:【例4.17】四位完全平方数
【题目描述】
输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。
【输入】
无
【输出】
由小到大输出,每个数占一行。
【输入样例】
无
【输出样例】
无
本题使用到的数学概念:
完全平方数:在数学中,完全平方数是指可以表示成某个整数的平方的字母。
本题学习到的新头文件:
cmath
本题学习到的函数:
cout<<sqrt(9); //结果3
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int gw,sw,bw,qw;
double pfg,pfg2;
for(int i=1122;i<=9999;i++)
{
gw=i%10;
sw=i/10%10;
bw=i/100%10;
qw=i/1000%10;
if((gw==sw) && (bw==qw))
{
pfg=sqrt(i);
pfg2=int(pfg);
if(pfg==pfg2)
{
cout<<i<<endl;
}
}
}
return 0;
}
1095:数1的个数
【题目描述】
给定一个十进制正整数n(1≤n≤10000)
,写下从1
到n
的所有整数,然后数一下其中出现的数字“1”的个数。
例如当n=2
时,写下1,2
。这样只出现了1
个“1”;当n=12
时,写下1,2,3,4,5,6,7,8,9,10,11,12
。这样出现了5
个“1”。
【输入】
正整数n
。1≤n≤10000
。
【输出】
一个正整数,即“1”的个数。
【输入样例】
12
【输出样例】
5
这一题,我们只用求出每个数字有几个“1”就行,建立一个变量,用来存放有几个“1”;
#include<iostream>
using namespace std;
int main()
{
int n,sum=1;
cin>>n;
for(int i=2; i<=n; i++)
for(int j=i; j>0; j/=10)
if(j%10==1)
sum++;
cout<<sum<<endl;
return 0;
}
2030:【例4.16】找素数
【题目描述】
输出正整数a
到b
之间的所有素数。
【输入】
输入a,b
。
【输出】
由小到大,输出a
到b
之间的所有素数。每个数占一行。
【输入样例】
5 10
【输出样例】
5
7
【提示】
【数据范围】
对于所有数据,1≤a≤b≤20000
。
题解:
这一题,用一个bool(变量名)来判断数字数否为素数,如果是,true。不是,false。
素数:一个数只有1和它自己本身因数的数叫质数
#include<iostream>
using namespace std;
int main()
{
int a,b;
bool k;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
k=true;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
k=false;
break;
}
}
if(k)
{
cout<<i<<endl;
}
}
return 0;
2031:【例4.17】四位完全平方数
【题目描述】
输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。
【输入】
无
【输出】
由小到大输出,每个数占一行。
【输入样例】
无
【输出样例】
无
这次,我们学到了一个新知识sqrt();他的意思是取相同的因数;
例:
sqrt(9); //输入9,结果3;
注意:括号后得有 ‘;’! ! !
注意:要用头文件:#include cmath
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int gw,sw,bw,qw;
double pfg,pfg2;
for(int i=1122;i<=9999;i++)
{
gw=i%10;
sw=i/10%10;
bw=i/100%10;
qw=i/1000%10;
if((gw==sw) && (bw==qw))
{
pfg=sqrt(i);
pfg2=int(pfg);
if(pfg==pfg2)
{
cout<<i<<endl;
}
}
}
return 0;
}
1095:数1的个数
【题目描述】
给定一个十进制正整数n(1≤n≤10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。
例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。
【输入】
正整数n。1≤n≤10000。
【输出】
一个正整数,即“1”的个数。
【输入样例】
12
【输出样例】
5
这道题并不复杂,用for循环找到1—n之间所有的数,再用while循环一层一层往下除,除到只剩1为止。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a,t,s=0;
cin>>a;
for(int i=1;i<=a;i++)
{
t=i;
while(t!=0)
{
if(t%10==1)
{
s++;
}
t/=10;
}
}
cout<<s;
return 0;
}
黄晟(dog)(^-^)

浙公网安备 33010602011771号