白日放歌须纵酒,青春作伴好还乡。

信息学奥赛一本通 第四章

第一节 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;
}

posted @ 2023-11-19 20:38  黄晟Dog  阅读(4029)  评论(0)    收藏  举报
Live2D