信息学奥赛一本通(C++版)第一部分 C++语言 第四章 循环结构的程序设计

第四章 循环结构的程序设计

第一节 for语句

T1059 : 求平均年龄

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。

【输入】

  第一行有一个整数 n ( 1 ≤ n ≤ 100 ) n(1≤n≤100) n(1n100),表示学生的人数。其后 n n n行每行有 1 1 1个整数,表示每个学生的年龄,取值为 15 15 15 25 25 25

【输出】

  输出一行,该行包含一个浮点数,为要求的平均年龄,保留到小数点后两位。

【输入样例】

2
18
17

【输出样例】

17.5

【答案&代码】

#include
//以上为头文件

int n,temp;
//以上为全局变量

int main(void){
	register int i,sum=0;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%d",&temp),
		sum+=temp;
	printf("%.2f\n",(double)sum/n);
	return 0;
}

T1060 : 均值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给出一组样本数据,包含 n n n个浮点数,计算其均值,精确到小数点后 4 4 4位。

【输入】

  输入有两行,第一行包含一个整数 n n n n n n小于 100 100 100),代表样本容量;第二行包含 n n n个绝对值不超过 1000 1000 1000的浮点数,代表各个样本数据。

【输出】

  输出一行,包含一个浮点数,表示均值,精确到小数点后 4 4 4位。

【输入样例】

2
1.0 3.0

【输出样例】

2.0000

【答案&代码】

#include
//以上为头文件

int n;
double temp;
//以上为全局变量

int main(void){
	register int i;
	register double sum=0;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%lf",&temp),
		sum+=temp;
	printf("%.4f\n",sum/n);
	return 0;
}

T1061 : 求整数的和与均值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  读入 n ( 1 ≤ n ≤ 10000 ) n(1≤n≤10000) n(1n10000)个整数,求它们的和与均值。

【输入】

  输入第一行是一个整数 n n n,表示有 n n n个整数。

  第 2 − n + 1 2-n+1 2n+1行每行包含 1 1 1个整数。每个整数的绝对值均不超过 10000 10000 10000

【输出】

  输出一行,先输出和,再输出平均值(保留到小数点后 5 5 5位),两个数间用单个空格分隔。

【输入样例】

4
344
222
343
222

【输出样例】

1131 282.75000

【答案&代码】

#include
//以上为头文件

int n,temp;
//以上为全局变量

int main(void){
	register int i,sum=0;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%d",&temp),
		sum+=temp;
	printf("%d %.5f\n",sum,(double)sum/n);
	return 0;
}

T1062 : 最高的分数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决这个问题吗?

【输入】

  输入两行,第一行为整数 n ( 1 ≤ n < 100 ) n(1≤n<100) n(1n<100),表示参加这次考试的人数.第二行是这 n n n个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为 0 0 0 100 100 100之间的整数。

【输出】

  输出一个整数,即最高的成绩。

【输入样例】

5
85 78 90 99 60

【输出样例】

99

【答案&代码】

#include
//以上为头文件

int n,temp;
//以上为全局变量

int main(void){
	register int i,MAX=-1;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&temp);
		if(temp>MAX)
			MAX=temp;
	}
	printf("%d\n",MAX);
	return 0;
}

T1063 : 最大跨度值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个长度为 n n n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = = =最大值减去最小值)。

【输入】

  一共 2 2 2行,第一行为序列的个数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1n1000),第二行为序列的 n n n个不超过 1000 1000 1000的非负整数,整数之间以一个空格分隔。

【输出】

  输出一行,表示序列的最大跨度值。

【输入样例】

6
3 0 8 7 5 9

【输出样例】

9

【答案&代码】

#include
//以上为头文件

int n,temp;
//以上为全局变量

int main(void){
	register int i,MAX=-1,MIN=1001;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&temp);
		if(temp>MAX)
			MAX=temp;
		if(temp<MIN)
			MIN=temp;
	}
	printf("%d\n",MAX-MIN);
	return 0;
}

T1064 : 奥运奖牌计数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

   2008 2008 2008年北京奥运会, A A A国的运动员参与了 n n n天的决赛项目 ( 1 ≤ n ≤ 17 ) (1≤n≤17) (1n17)。现在要统计一下 A A A国所获得的金、银、铜牌数目及总奖牌数。输入第 1 1 1行是 A A A国参与决赛项目的天数 n n n,其后 n n n行,每一行是该国某一天获得的金、银、铜牌数目。输出 4 4 4个整数,为 A A A国所获得的金、银、铜牌总数及总奖牌数。

【输入】

  输入 n + 1 n+1 n+1行,第 1 1 1行是 A A A国参与决赛项目的天数 n n n,其后 n n n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。

【输出】

  输出 1 1 1行,包括 4 4 4个整数,为 A A A国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。

【输入样例】

3
1 0 3
3 1 0
0 3 0

【输出样例】

4 4 3 11

【答案&代码】

#include
//以上为头文件

int n,sum[4],temp[4];
//以上为全局变量

int main(void){
	register int i,j;
	//以上为寄存器变量
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		for(j=1;j<=3;++j)
			scanf("%d",&temp[j]),
			sum[j]+=temp[j];
	for(i=1;i<=3;++i)
		printf("%d ",sum[i]);
	printf("%d\n",sum[1]+sum[2]+sum[3]);
	return 0;
}

T1065 : 奇数求和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  计算非负整数 m m m n n n(包括 m m m n n n)之间的所有奇数的和,其中, m m m不大于 n n n,且 n n n不大于 300 300 300。例如 m = 3 , n = 12 m=3,n=12 m=3,n=12,其和则为: 3 + 5 + 7 + 9 + 11 = 35 3+5+7+9+11=35 3+5+7+9+11=35

【输入】

  两个数 m m m n n n,两个数以一个空格分开,其中 0 ≤ m ≤ n ≤ 300 0≤m≤n≤300 0mn300

【输出】

  输出一行,包含一个整数,表示 m m m n n n(包括 m m m n n n)之间的所有奇数的和。

【输入样例】

7 15

【输出样例】

55

【答案&代码】

#include
//以上为头文件

int m,n;
//以上为全局变量

int main(void){
	register int sum=0;
	//以上为寄存器变量
	scanf("%d%d",&m,&n);
	for(;m<=n;++m)
		if(m&1)
			sum+=m;
	printf("%d\n",sum);
	return 0;
}

T1066 : 满足条件的数累加

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  将正整数 m m m n n n之间(包括 m m m n n n)能被 17 17 17整除的数累加,其中 0 < m < n < 1000 0<m<n<1000 0<m<n<1000

【输入】

  一行,包含两个整数 m m m n n n,其间,以一个空格间隔。

【输出】

  输出一行,包行一个整数,表示累加的结果。

【输入样例】

50 85

【输出样例】

204

【答案&代码】

#include
//以上为头文件

int m,n;
//以上为全局变量

int main(void){
	register int sum=0;
	//以上为寄存器变量
	scanf("%d%d",&m,&n);
	for(;m<=n;++m)
		if(m%17==0)
			sum+=m;
	printf("%d\n",sum);
	return 0;
}

T1067 : 整数的个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定 k ( 1 < k < 100 ) k(1<k<100) k(1<k<100)个正整数,其中每个数都是大于等于 1 1 1,小于等于 10 10 10的数。写程序计算给定的 k k k个正整数中, 1 , 5 , 10 1,5,10 1,5,10出现的次数。

【输入】

  输入有两行:第一行包含一个正整数 k k k,第二行包含 k k k个正整数,每两个正整数用一个空格分开。

【输出】

  输出有三行,第一行为 1 1 1出现的次数,,第二行为 5 5 5出现的次数,第三行为 10 10 10出现的次数。

【输入样例】

5
1 5 8 10 5

【输出样例】

1
2
1

【答案&代码】

#include
int main(void){
	int k;
	scanf("%d",&k);
	int sum[3]={0};
	for(int i=0;i<k;i++){
		int temp;
		scanf("%d",&temp);
		if(temp==1)
			sum[0]+=1;
		else if(temp==5)
			sum[1]+=1;
		else if(temp==10)
			sum[2]+=1;
	}
	printf("%d\n%d\n%d\n",sum[0],sum[1],sum[2]);
	return 0;
}

T1068 : 与指定数字相同的数的个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  输出一个整数序列中与指定数字相同的数的个数。输入包含 2 2 2行:第 1 1 1行为 N N N m m m,表示整数序列的长度 ( N ≤ 100 ) (N≤100) (N100)和指定的数字;第 2 2 2行为 N N N个整数,整数之间以一个空格分开。输出为 N N N个数中与 m m m相同的数的个数。

【输入】

  第 1 1 1行为 N N N m m m,表示整数序列的长度 ( N ≤ 100 ) (N≤100) (N100)和指定的数字, 中间用一个空格分开;

  第 2 2 2行为 N N N个整数,整数之间以一个空格分开。

【输出】

  输出为 N N N个数中与 m m m相同的数的个数。

【输入样例】

3 2
2 3 2

【输出样例】

2

【答案&代码】

#include
int main(void){
	int n,m;
	scanf("%d%d",&n,&m);
	int sum=0;
	for(int i=0;i<n;i++){
		int temp;
		scanf("%d",&temp);
		if(temp==m)
			sum+=1;
	}
	printf("%d\n",sum);
	return 0;
}

T1069 : 乘方计算

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给出一个整数 a a a和一个正整数 n ( − 1000000 ≤ a ≤ 1000000 , 1 ≤ n ≤ 10000 ) n(-1000000≤a≤1000000,1≤n≤10000) n(1000000a1000000,1n10000),求乘方 a n a^{n} an,即乘方结果。最终结果的绝对值不超过 1000000 1000000 1000000

【输入】

  一行,包含两个整数 a a a n n n − 1000000 ≤ a ≤ 1000000 , 1 ≤ n ≤ 10000 -1000000≤a≤1000000,1≤n≤10000 1000000a1000000,1n10000

【输出】

  一个整数,即乘方结果。题目保证最终结果的绝对值不超过 1000000 1000000 1000000

【输入样例】

2 3

【输出样例】

8

【答案&代码】

#include
#include
int main(void){
	int a,n;
	scanf("%d%d",&a,&n);
	printf("%d\n",(int)pow(a,n));
	return 0;
}

T1070 : 人口增长

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  我国现有 x x x亿人口,按照每年 0.1 % 0.1\% 0.1%的增长速度, n n n年后将有多少人?保留小数点后四位。

【输入】

  一行,包含两个整数 x x x n n n,分别是人口基数和年数,以单个空格分隔。

【输出】

  输出最后的人口数,以亿为单位,保留到小数点后四位。 1 ≤ x ≤ 100 , 1 ≤ n ≤ 100 1≤x≤100,1≤n≤100 1x100,1n100

【输入样例】

13 10

【输出样例】

13.1306

【答案&代码】

#include
#include
int main(void){
	int a,n;
	scanf("%d%d",&a,&n);
	printf("%.4f\n",pow(1.001,n)*a);
	return 0;
}

T1071 : 菲波那契数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  菲波那契数列是指这样的数列:数列的第一个和第二个数都为 1 1 1,接下来每个数都等于前面 2 2 2个数之和。给出一个正整数 k k k,要求菲波那契数列中第 k k k个数是多少。

【输入】

  输入一行,包含一个正整数 k ( 1 ≤ k ≤ 46 ) k(1≤k≤46) k(1k46)

【输出】

  输出一行,包含一个正整数,表示菲波那契数列中第 k k k个数的大小。

【输入样例】

19

【输出样例】

4181

【答案&代码】

#include
int main(void){
	int k;
	scanf("%d",&k);
	int num[k];
	num[0]=num[1]=1;
	for(int i=2;i<k;i++)
		num[i]=num[i-1]+num[i-2];
	printf("%d\n",num[k-1]);
	return 0;
}

T1072 : 鸡尾酒疗法

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  鸡尾酒疗法,指高效抗逆转录病毒治疗。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式进行。假设鸡尾酒疗法的有效率为 x x x,新疗法的有效率为 y y y,如果 y − x y-x yx大于 5 % 5\% 5%,则效果更好,如果 x − y x-y xy大于 5 % 5\% 5%,则效果更差,否则称为效果差不多。下面给出 n n n组临床对照实验,其中第一组采用鸡尾酒疗法,其他 n − 1 n-1 n1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。

【输入】

  第一行为整数 n ( 1 < n ≤ 20 ) n(1<n≤20) n(1<n20);其余 n n n行每行两个整数,第一个整数是临床实验的总病例数(小于等于 10000 10000 10000),第二个疗效有效的病例数。这 n n n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。

【输出】

  有 n − 1 n-1 n1行输出,分别表示对应改进疗法的效果:如果效果更好,输出better;如果效果更差,输出worse;否则输出same

【输入样例】

5
125 99 
112 89
145 99
99 97
123 98

【输出样例】

same
worse
better
same

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	int jw1,jw2;
	scanf("%d%d",&jw1,&jw2);
	double x=(double)jw2/jw1;
	for(int i=0;i<n-1;i++){
		int temp1,temp2;
		scanf("%d%d",&temp1,&temp2);
		double y=(double)temp2/temp1;
		if(y-x>0.05)
			printf("better\n");
		else if(x-y>0.05)
			printf("worse\n");
		else
			printf("same\n");
	}
	return 0;
}

T1073 : 救援

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  救生船从大本营出发,营救若干屋顶上的人回到大本营,屋顶数目以及每个屋顶的坐标和人数都将由输入决定,求出所有人都到达大本营并登陆所用的时间。

  在直角坐标系的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。坐标系中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度 50 m / m i n 50m/min 50m/min驶向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船 1 1 1分钟,船原路返回,达到大本营,每人下船 0.5 0.5 0.5分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。

【输入】

  第一行,一个整数,表示屋顶数 n n n。接下来依次有 n n n行输入,每一行上包含两个表示屋顶相对于大本营的平面坐标位置的实数(单位是 m m m)、一个表示人数的整数。

【输出】

  救援需要的总时间,精确到分钟(向上取整)。

【输入样例】

1
30 40 3

【输出样例】

7

【答案&代码】

#include
#include
int main(void){
	int n;
	scanf("%d",&n);
	double sum=0;
	for(int i=0;i<n;i++){
		double x,y,k;
		scanf("%lf%lf%lf",&x,&y,&k);
		sum+=sqrt(x*x+y*y)*2/50+k*1.5;
	}
	printf("%.0f",ceil(sum));
	return 0;
}

T1074 : 津津的储蓄计划

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

  为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20 % 20\% 20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 100 100元或恰好 100 100 100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

  例如 11 11 11月初津津手中还有 83 83 83元,妈妈给了津津 300 300 300元。津津预计 11 11 11月的花销是 180 180 180元,那么她就会在妈妈那里存 200 200 200元,自己留下 183 183 183元。到了 11 11 11月月末,津津手中会剩下 3 3 3元钱。

  现在请你根据 2004 2004 2004 1 1 1月到 12 12 12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 2004 2004年年末,妈妈将津津平常存的钱加上 20 % 20\% 20%还给津津之后,津津手中会有多少钱。

【输入】

  包括 12 12 12行数据,每行包含一个小于 350 350 350的非负整数,分别表示 1 1 1月到 12 12 12月津津的预算。

【输出】

  只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 − X -X X X X X表示出现这种情况的第一个月;否则输出到 2004 2004 2004年年末津津手中会有多少钱。

【输入样例】

290
230
280
200
300
170
340
50 
90 
80 
200
60

【输出样例】

-7

【答案&代码】

#include
int main(void){
	int leave=0,need,sum=0;
	for(int i=1;i<=12;i++){
		leave+=300;
		scanf("%d",&need);
		leave-=need;
		if(leave>=0){
			sum+=leave/100;
			leave-=(int)(leave/100)*100;
		}
		else{
			printf("-%d",i);
			return 0;
		}
	}
	printf("%d",sum*120+leave);
	return 0; 
}

T1075 : 药房管理

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医疗过程中,从而极大地提高了医院整体的工作效率。

  对药品的管理是其中的一项重要内容。现在药房的管理员希望使用计算机来帮助他管理。假设对于任意一种药品,每天开始工作时的库存总量已知,并且一天之内不会通过进货的方式增加。每天会有很多病人前来取药,每个病人希望取走不同数量的药品。如果病人需要的数量超过了当时的库存量,药房会拒绝该病人的请求。管理员希望知道每天会有多少病人没有取上药。

【输入】

  共 3 3 3行,第一行是每天开始时的药品总量 m m m

  第二行是这一天取药的人数 n ( 0 < n ≤ 100 ) n(0<n≤100) n(0<n100)

  第三行共有 n n n个数,分别记录了每个病人希望取走的药品数量(按照时间先后的顺序)。

【输出】

  只有 1 1 1行,为这一天没有取上药品的人数。

【输入样例】

30
6
10 5 20 6 7 8

【输出样例】

2

【答案&代码】

#include
int main(void){
	int m,n;
	scanf("%d%d",&m,&n);
	int sum=0;
	for(int i=0;i<n;i++){
		int temp;
		scanf("%d",&temp);
		if(temp>m)
			sum+=1;
		else
			m-=temp;
	}
	printf("%d",sum);
	return 0; 
}

T1076 : 正常血压

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  监护室每小时测量一次病人的血压,若收缩压在 90 − 140 90-140 90140之间并且舒张压在 60 − 90 60-90 6090之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。

【输入】

  第一行为一个正整数 n ( n < 100 ) n(n<100) n(n<100),其后有 n n n行,每行 2 2 2个正整数,分别为一次测量的收缩压和舒张压。

【输出】

  输出仅一行,血压连续正常的最长小时数。

【输入样例】

4
100 80
90 50
120 60
140 90

【输出样例】

2

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	int max=-1;
	for(int i=0,sum=0;i<n;i++){
		int ss,sz;
		scanf("%d%d",&ss,&sz);
		if(90<=ss&&ss<=140&&60<=sz&&sz<=90)
			sum+=1;
		else
			sum=0;
		if(sum>max)
			max=sum;
	}
	printf("%d",max);
	return 0; 
}

T1077 : 统计满足条件的4位数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字的结果大于零。

【输入】

  输入为两行,第一行为四位数的个数 n n n,第二行为 n ( n ≤ 100 ) n(n≤100) n(n100)个的四位数。

【输出】

  输出为一行,包含一个整数,表示满足条件的四位数的个数。

【输入样例】

5
1234 1349 6119 2123 5017

【输出样例】

3

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	int sum=0;
	for(int i=0;i<n;i++){
		int temp;
		scanf("%d",&temp);
		int qw=temp/1000,bw=(temp/100)%10,sw=(temp/10)%10,gw=temp%10;
		if((gw-qw-bw-sw)>0)
			sum+=1;
	}
	printf("%d",sum);
	return 0; 
}

T1078 : 求分数序列和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  有一个分数序列 q 1 p 1 , q 2 p 2 , q 3 p 3 , q 4 p 4 , q 5 p 5 , . . . \frac{q_1}{p_1},\frac{q_2}{p_2},\frac{q_3}{p_3},\frac{q_4}{p_4},\frac{q_5}{p_5},... p1q1,p2q2,p3q3,p4q4,p5q5,...,其中 q i + 1 = q i + p i , p i + 1 = q i , p 1 = 1 , q 1 = 2 q_{i+1}=q_i+p_i,p_{i+1}=q_i,p_1=1,q_1=2 qi+1=qi+pi,pi+1=qi,p1=1,q1=2。求这个分数序列的前 n n n项之和。

【输入】

  输入有一行,包含一个正整数 n ( n ≤ 30 ) n(n≤30) n(n30)

【输出】

  输出有一行,包含一个浮点数,表示分数序列前 n n n项的和,精确到小数点后 4 4 4位。

【输入样例】

2

【输出样例】

3.5000

【答案&代码】

#include
int f(int n){
	if(n==1||n==0)
		return 1;
	else
		return f(n-1)+f(n-2);
}
int main(void){
	int n;
	scanf("%d",&n);
	double sum=0;
	for(int i=1;i<=n;i++)
		sum+=(double)f(i+1)/f(i);
	printf("%.4f",sum); 
	return 0; 
}

T1079 : 求分数序列和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  编写程序,输入 n n n的值,求 ∑ i = 1 n ( − 1 ) i − 1 1 i \sum^n_{i=1}(-1)^{i-1}\frac{1}{i} i=1n(1)i1i1的值。

【输入】

  输入一个正整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1n1000)

【输出】

  输出一个实数,为表达式的值,保留到小数点后四位。

【输入样例】

2

【输出样例】

0.5000

【答案&代码】

#include
#include
int main(void){
	int n;
	scanf("%d",&n);
	double sum=0;
	for(int i=1;i<=n;i++)
		sum+=pow(-1,i-1)*1.0/i;
	printf("%.4f",sum); 
	return 0; 
}

T1080 : 余数相同问题

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  已知三个正整数 a , b , c a,b,c a,b,c。现有一个大于 1 1 1的整数 x x x,将其作为除数分别除 a , b , c a,b,c a,b,c,得到的余数相同。

  请问满足上述条件的 x x x的最小值是多少?数据保证 x x x有解。

【输入】

  一行,三个不大于1000000的正整数 a , b , c a,b,c a,b,c,两个整数之间用一个空格隔开。

【输出】

  一个整数,即满足条件的 x x x的最小值。

【输入样例】

300 262 205

【输出样例】

19

【答案&代码】

#include
int main(void){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	for(int i=2;;i++)
		if(a%i==b%i&&b%i==c%i){
			printf("%d",i);
			return 0;
		}
	return 0; 
}

T1081 : 分苹果

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  把一堆苹果分给 n n n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个?

【输入】

  一个不大于 1000 1000 1000的正整数 n n n,代表小朋友人数。

【输出】

  一个整数,表示满足条件的最少苹果个数。

【输入样例】

8

【输出样例】

36

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	printf("%d",(n*n+n)/2);
	return 0; 
}

T1082 : 求小数的某一位

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  分数 a b \frac{a}{b} ba化为小数后,小数点后第 n n n位的数字是多少?

【输入】

  三个正整数 a , b , n a,b,n a,b,n,相邻两个数之间用单个空格隔开。 0 < a < b < 100 , 1 ≤ n ≤ 10000 0<a<b<100,1≤n≤10000 0<a<b<100,1n10000

【输出】

  一个数字。

【输入样例】

1 2 1

【输出样例】

5

【答案&代码】

#include
int main(void){
	int a,b,n;
	scanf("%d%d%d",&a,&b,&n);
	if(a>b)
		a%=b;
	int ans=0;
	for(int i=1;i<=n;i++)
		ans=10*a/b,a=10*a-b*ans;
	printf("%d",ans);
	return 0;
}

T1083 : 计算星期几

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  假设今天是星期日,那么过 a b a^b ab天之后是星期几?

【输入】

  两个正整数 a , b a,b a,b,中间用单个空格隔开。 0 < a ≤ 100 , 0 < b ≤ 10000 0<a≤100,0<b≤10000 0<a100,0<b10000

【输出】

  一个字符串,代表过 a b a^b ab天之后是星期几。

  其中,Monday是星期一,Tuesday是星期二,Wednesday是星期三,Thursday是星期四,Friday是星期五,Saturday是星期六,Sunday是星期日。

【输入样例】

3 2000

【输出样例】

Tuesday

【答案&代码】

#include
#include
int main(void){
	int a,b;
	scanf("%d%d",&a,&b);
	int c=1;
	for(int i=1;i<=b;i++)
		c*=a,c%=7;
	switch(c){
		case 0:printf("Sunday");break;
		case 1:printf("Monday");break;
		case 2:printf("Tuesday");break;
		case 3:printf("Wednesday");break;
		case 4:printf("Thursday");break;
		case 5:printf("Friday");break;
		case 6:printf("Saturday");break;
	}
	return 0; 
}

T1084 : 幂的末尾

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  幂 a b a^b ab的末 3 3 3位数是多少?

【输入】

  两个正整数 a , b a,b a,b 1 ≤ a ≤ 100 , 1 ≤ b ≤ 10000 1≤a≤100,1≤b≤10000 1a100,1b10000

【输出】

  从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。

【输入样例】

7 2011

【输出样例】

743

【答案&代码】

#include
#include
int main(void){
	int a,b;
	scanf("%d%d",&a,&b);
	int c=1;
	for(int i=1;i<=b;i++)
		c*=a,c%=1000;
	printf("%.3d",c);
	return 0; 
}

第二节 while语句

T1085 : 球弹跳高度的计算

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  一球从某一高度 h h h落下(单位:米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第 10 10 10次落地时,共经过多少米? 第 10 10 10次反弹多高?

  输出包含两行,第 1 1 1行:到球第 10 10 10次落地时,一共经过的米数。第 2 2 2行:第 10 10 10次弹跳的高度。

【输入】

  输入一个整数 h h h,表示球的初始高度。

【输出】

  第 1 1 1行:到球第 10 10 10次落地时,一共经过的米数。

  第 2 2 2行:第 10 10 10次弹跳的高度。

  注意:结果可能是实数,结果用double类型保存。

  提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。

【输入样例】

20

【输出样例】

59.9219
0.0195312

【答案&代码】

#include
double fun1(int n,double h){
	if(n==1){
		return h;
	}
	return h+fun1(n-1,h/2);
}
double fun2(int n,double h){
	if(n==1)
		return h/2;
	else
		return fun2(n-1,h/2);
}
int main(void){
	double h; 
	scanf("%lf",&h);
	printf("%g\n%g",fun1(10,h)*2-h,fun2(10,h));
	return 0;
}

T1086 : 角谷猜想

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 3 3 1 1 1,如果是偶数,则除以 2 2 2,得到的结果再按照上述规则重复处理,最终总能够得到 1 1 1。如,假定初始整数为 5 5 5,计算过程分别为 16 , 8 , 4 , 2 , 1 16,8,4,2,1 16,8,4,2,1。程序要求输入一个整数,将经过处理得到 1 1 1的过程输出来。

【输入】

  一个正整数 N ( N ≤ 2 , 000 , 000 ) N(N≤2,000,000) N(N2,000,000)

【输出】

  从输入整数到 1 1 1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出End。如果输入为 1 1 1,直接输出End

【输入样例】

5

【输出样例】

5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End

【答案&代码】

#include
#include
int main(void){
	int n;
	scanf("%d",&n);
	for(;n!=1;){
		if(n%2==1)
			printf("%d*3+1=%d\n",n,n*3+1),n=3*n+1;
		else
			printf("%d/2=%d\n",n,n/2),n/=2;
	}
	printf("End");
	return 0; 
}

T1087 : 级数求和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  已知:

S n = ∑ i = 1 n 1 i S_n=\sum^n_{i=1}\frac{1}{i} Sn=i=1ni1

  显然对于任意一个整数 k k k,当 n n n足够大的时候, S n S_n Sn大于 k k k。现给出一个整数 k ( 1 ≤ k ≤ 15 ) k(1≤k≤15) k(1k15),要求计算出一个最小的 n n n,使得 S n > k S_n>k Sn>k

【输入】

  一个整数 k k k

【输出】

  一个整数 n n n

【输入样例】

1

【输出样例】

2

【答案&代码】

#include
#include
int main(void){
	int k;
	scanf("%d",&k);
	double S=0;
	for(int i=1;;i++){
		S+=1.0/i;
		if(S>k){
			printf("%d",i);return 0;
		}
	}
	return 0; 
}

T1088 : 分离整数的各个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个整数 n ( 1 ≤ n ≤ 100000000 ) n(1≤n≤100000000) n(1n100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。

【输入】

  输入一个整数,整数在 1 1 1 100000000 100000000 100000000之间。

【输出】

  从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

【输入样例】

123

【输出样例】

3 2 1

【答案&代码】

#include
#include
int main(void){
	int num;
	scanf("%d",&num);
	char str[10];
	sprintf(str,"%d",num);
	for(int i=strlen(str)-1;i>=0;i--)
		printf("%c ",str[i]);
	return 0; 
}

T1089 : 数字反转

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入 − 380 -380 380,反转后得到的新数为 − 83 -83 83

【输入】

  输入共 1 1 1行,一个整数 N N N

   − 1 , 000 , 000 , 000 ≤ N ≤ 1 , 000 , 000 , 000 -1,000,000,000≤N≤1,000,000,000 1,000,000,000N1,000,000,000

【输出】

  从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

【输入样例】

123

【输出样例】

321

【答案&代码】

#include
#include
int main(void){
	int num;
	scanf("%d",&num);
	char str[16];
	sprintf(str,"%d",num);
	for(int i=0;i<strlen(str)/2;i++){
		char temp=str[i];
		str[i]=str[strlen(str)-i-1];
		str[strlen(str)-i-1]=temp;
	}
		
	if(num<0)
		printf("-");
	sscanf(str,"%d",&num);
	printf("%d",num); 
	return 0;
}

T1090 : 含k个3的数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  输入两个正整数 m m m k k k,其中 1 < m < 100000 , 1 < k < 5 1<m<100000,1<k<5 1<m<100000,1<k<5 ,判断 m m m能否被 19 19 19整除,且恰好含有 k k k 3 3 3,如果满足条件,则输出YES,否则,输出NO

  例如,输入:43833 3,满足条件,输出YES。如果输入:39331 3,尽管有 3 3 3 3 3 3,但不能被 19 19 19整除,也不满足条件,应输出NO

【输入】

   m m m k k k的值,中间用单个空格间隔。

【输出】

  满足条件时输出YES,不满足时输出NO

【输入样例】

43833 3

【输出样例】

YES

【答案&代码】

#include
#include
int main(void){
	int num,k;
	scanf("%d%d",&num,&k);
	char str[16];
	sprintf(str,"%d",num);
	int sum=0;
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='3')
			sum+=1;
	if(sum==k&&num%19==0)
		printf("YES");
	else
		printf("NO");
	return 0;
}

第三节 do-while语句

T1085 : 球弹跳高度的计算

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  一球从某一高度 h h h落下(单位:米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第 10 10 10次落地时,共经过多少米? 第 10 10 10次反弹多高?

  输出包含两行,第 1 1 1行:到球第 10 10 10次落地时,一共经过的米数。第 2 2 2行:第 10 10 10次弹跳的高度。

【输入】

  输入一个整数 h h h,表示球的初始高度。

【输出】

  第 1 1 1行:到球第 10 10 10次落地时,一共经过的米数。

  第 2 2 2行:第 10 10 10次弹跳的高度。

  注意:结果可能是实数,结果用double类型保存。

  提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。

【输入样例】

20

【输出样例】

59.9219
0.0195312

【答案&代码】

#include
double fun1(int n,double h){
	if(n==1)
		return h;
	return h+fun1(n-1,h/2);
}
double fun2(int n,double h){
	if(n==1)
		return h/2;
	else
		return fun2(n-1,h/2);
}
int main(void){
	double h; 
	scanf("%lf",&h);
	printf("%g\n%g",fun1(10,h)*2-h,fun2(10,h));
	return 0;
}

T1086 : 角谷猜想

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 3 3 1 1 1,如果是偶数,则除以 2 2 2,得到的结果再按照上述规则重复处理,最终总能够得到 1 1 1。如,假定初始整数为 5 5 5,计算过程分别为 16 , 8 , 4 , 2 , 1 16,8,4,2,1 16,8,4,2,1。程序要求输入一个整数,将经过处理得到 1 1 1的过程输出来。

【输入】

  一个正整数 N ( N ≤ 2 , 000 , 000 ) N(N≤2,000,000) N(N2,000,000)

【输出】

  从输入整数到 1 1 1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出End。如果输入为 1 1 1,直接输出End

【输入样例】

5

【输出样例】

5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End

【答案&代码】

#include
#include
int main(void){
	int n;
	scanf("%d",&n);
	for(;n!=1;){
		if(n%2==1)
			printf("%d*3+1=%d\n",n,n*3+1),n=3*n+1;
		else
			printf("%d/2=%d\n",n,n/2),n/=2;
	}
	printf("End");
	return 0; 
}

T1087 : 级数求和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  已知:

S n = ∑ i = 1 n 1 i S_n=\sum^n_{i=1}\frac{1}{i} Sn=i=1ni1

  显然对于任意一个整数 k k k,当 n n n足够大的时候, S n S_n Sn大于 k k k。现给出一个整数 k ( 1 ≤ k ≤ 15 ) k(1≤k≤15) k(1k15),要求计算出一个最小的 n n n,使得 S n > k S_n>k Sn>k

【输入】

  一个整数 k k k

【输出】

  一个整数 n n n

【输入样例】

1

【输出样例】

2

【答案&代码】

#include
#include
int main(void){
	int k;
	scanf("%d",&k);
	double S=0;
	for(int i=1;;i++){
		S+=1.0/i;
		if(S>k){
			printf("%d",i);return 0;
		}
	}
	return 0; 
}

T1088 : 分离整数的各个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个整数 n ( 1 ≤ n ≤ 100000000 ) n(1≤n≤100000000) n(1n100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。

【输入】

  输入一个整数,整数在 1 1 1 100000000 100000000 100000000之间。

【输出】

  从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

【输入样例】

123

【输出样例】

3 2 1

【答案&代码】

#include
#include
int main(void){
	int num;
	scanf("%d",&num);
	char str[10];
	sprintf(str,"%d",num);
	for(int i=strlen(str)-1;i>=0;i--)
		printf("%c ",str[i]);
	return 0; 
}

T1089 : 数字反转

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入 − 380 -380 380,反转后得到的新数为 − 83 -83 83

【输入】

  输入共 1 1 1行,一个整数 N N N

   − 1 , 000 , 000 , 000 ≤ N ≤ 1 , 000 , 000 , 000 -1,000,000,000≤N≤1,000,000,000 1,000,000,000N1,000,000,000

【输出】

  从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

【输入样例】

123

【输出样例】

321

【答案&代码】

#include
#include
int main(void){
	int num;
	scanf("%d",&num);
	char str[16];
	sprintf(str,"%d",num);
	for(int i=0;i<strlen(str)/2;i++){
		char temp=str[i];
		str[i]=str[strlen(str)-i-1];
		str[strlen(str)-i-1]=temp;
	}
		
	if(num<0)
		printf("-");
	sscanf(str,"%d",&num);
	printf("%d",num); 
	return 0;
}

T1090 : 含k个3的数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  输入两个正整数 m m m k k k,其中 1 < m < 100000 , 1 < k < 5 1<m<100000,1<k<5 1<m<100000,1<k<5 ,判断 m m m能否被 19 19 19整除,且恰好含有 k k k 3 3 3,如果满足条件,则输出YES,否则,输出NO

  例如,输入:43833 3,满足条件,输出YES。如果输入:39331 3,尽管有 3 3 3 3 3 3,但不能被 19 19 19整除,也不满足条件,应输出NO

【输入】

   m m m k k k的值,中间用单个空格间隔。

【输出】

  满足条件时输出YES,不满足时输出NO

【输入样例】

43833 3

【输出样例】

YES

【答案&代码】

#include
#include
int main(void){
	int num,k;
	scanf("%d%d",&num,&k);
	char str[16];
	sprintf(str,"%d",num);
	int sum=0;
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='3')
			sum+=1;
	if(sum==k&&num%19==0)
		printf("YES");
	else
		printf("NO");
	return 0;
}

第四节 循环嵌套

T1091 : 求阶乘的和

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定正整数 n n n,求不大于 n n n的正整数的阶乘的和,即

∑ i = 1 n ∏ j = 1 i j \sum^{n}_{i=1}\prod^{i}_{j=1}j i=1nj=1ij

  输出阶乘的和。

【输入】

  输入有一行,包含一个正整数 n ( 1 < n < 12 ) n(1<n<12) n(1<n<12)

【输出】

  输出有一行:阶乘的和。

【输入样例】

5

【输出样例】

153

【答案&代码】

#include
int main(void){
	int n;
	scanf("%d",&n);
	int sum=0;
	for(int i=1,temp=1;i<=n;i++){
		sum+=temp*i;
		temp*=i;
	} 
	printf("%d",sum);
	return 0;
}

T1092 : 求出e的值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  利用公式 e = ∑ i = 0 ∞ 1 i ! e=\sum^{\infty}_{i=0}\frac{1}{i!} e=i=0i!1

  求 e e e的值,要求保留小数点后 10 10 10位。

【输入】

  输入只有一行,该行包含一个整数 n ( 2 ≤ n ≤ 15 ) n(2≤n≤15) n(2n15),表示计算 e e e时累加到 1 n ! \frac{1}{n!} n!1

【输出】

  输出只有一行,该行包含计算出来的 e e e的值,要求打印小数点后 10 10 10位。

【输入样例】

10

【输出样例】

2.7182818011

【答案&代码】

#include
unsigned long long f(int n){
	unsigned long long result=1;
	for(int i=1;i<=n;i++)
		result*=i;
	return result;
}
int main(void){
	int n;
	scanf("%d",&n);
	double e=1;
	for(int i=1;i<=n;i++){
		e+=1.0/f(i);
	}
	printf("%.10f",e);
	return 0;
}

T1093 : 计算多项式的值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  假定多项式的形式为

∑ i = 0 n x i = x n + x n − 1 + . . . + x + 1 \sum^{n}_{i=0}{x^{i}}=x^{n}+x^{n-1}+...+x+1 i=0nxi=xn+xn1+...+x+1

  请计算给定单精度浮点数 x x x和正整数 n n n值的情况下这个多项式的值。 x x xfloat范围内, n ≤ 1000000 n≤1000000 n1000000。多项式的值精确到小数点后两位,保证最终结果在float范围内。

【输入】

  输入仅一行,包括 x x x n n n,用单个空格隔开。 x x xfloat范围内, n ≤ 1000000 n≤1000000 n1000000

【输出】

  输出一个实数,即多项式的值,精确到小数点后两位。保证最终结果在float范围内。

【输入样例】

2.0 4

【输出样例】

31.00

【答案&代码】

#include
#include
int main(void){
	int n;
	double x;
	scanf("%lf%d",&x,&n);
	double sum=1;
	for(int i=1;i<=n;i++)
		sum+=pow(x,i);
	printf("%.2f",sum);
	return 0;
}

T1094 : 与7无关的数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  一个正整数,如果它能被 7 7 7整除,或者它的十进制表示法中某一位上的数字为 7 7 7,则称其为与 7 7 7相关的数。现求所有小于等于 n ( n < 100 ) n(n<100) n(n<100) 7 7 7无关的正整数的平方和。

【输入】

  输入为一行,正整数 n ( n < 100 ) n(n<100) n(n<100)

【输出】

  输出一行,包含一个整数,即小于等于 n n n的所有与 7 7 7无关的正整数的平方和。

【输入样例】

21

【输出样例】

2336

【答案&代码】

#include
#include

bool f(int n){
	if(n%7==0)
		return false;
	char str[16];
	sprintf(str,"%d",n);
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='7')
			return false;
	return true; 
}
int main(void){
	int n;
	scanf("%d",&n);
	int sum=0;
	for(int i=1;i<=n;i++)
		if(f(i))
			sum+=i*i;
	printf("%d",sum); 
	return 0;
}

T1095 : 数1的个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定一个十进制正整数 n ( 1 ≤ n ≤ 10000 ) n(1≤n≤10000) n(1n10000),写下从 1 1 1 n n n的所有整数,然后数一下其中出现的数字 1 1 1的个数。

  例如当 n = 2 n=2 n=2时,写下 1 , 2 1,2 1,2。这样只出现了 1 1 1 1 1 1;当 n = 12 n=12 n=12时,写下 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 1,2,3,4,5,6,7,8,9,10,11,12 1,2,3,4,5,6,7,8,9,10,11,12。这样出现了 5 5 5 1 1 1

【输入】

  正整数 n ( 1 ≤ n ≤ 10000 ) n(1≤n≤10000) n(1n10000)

【输出】

  一个正整数,即 1 1 1的个数。

【输入样例】

12

【输出样例】

5

【答案&代码】

#include
#include

int f(int n){
	char str[16];
	int sum=0;
	sprintf(str,"%d",n);
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='1')
			sum+=1;
	return sum; 
}
int main(void){
	int n;
	scanf("%d",&n);
	int sum=0;
	for(int i=1;i<=n;i++)
		sum+=f(i);
	printf("%d",sum); 
	return 0;
}

T1096 : 数字统计

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  请统计某个给定范围 [ L , R ] [L,R] [L,R]的所有整数中,数字 2 2 2出现的次数。

  比如给定范围 [ 2 , 22 ] [2,22] [2,22],数字 2 2 2在数 2 2 2中出现了 1 1 1次,在数 12 12 12中出现 1 1 1次,在数 20 20 20中出现 1 1 1次,在数 21 21 21中出现 1 1 1次,在数 22 22 22中出现 2 2 2次,所以数字 2 2 2在该范围内一共出现了 6 6 6次。

【输入】

  输入共 1 1 1行,为两个正整数 L L L R R R,之间用一个空格隔开。

【输出】

  输出共 1 1 1行,表示数字 2 2 2出现的次数。

【输入样例】

2 22

【输出样例】

6

【答案&代码】

#include
#include

int f(int n){
	char str[16];
	int sum=0;
	sprintf(str,"%d",n);
	for(int i=0;i<strlen(str);i++)
		if(str[i]=='2')
			sum+=1;
	return sum; 
}
int main(void){
	int l,r;
	scanf("%d%d",&l,&r);
	int sum=0;
	for(int i=l;i<=r;i++)
		sum+=f(i);
	printf("%d",sum); 
	return 0;
}

T1097 : 画矩形

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  根据参数,画出矩形。输入四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于 3 3 3行不多于 10 10 10行,宽不少于 5 5 5列不多于 10 10 10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为 1 1 1 0 0 0 0 0 0代表空心, 1 1 1代表实心。

【输入】

  输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于 3 3 3行不多于 10 10 10行,宽不少于 5 5 5列不多于 10 10 10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为 1 1 1 0 0 0 0 0 0代表空心, 1 1 1代表实心。

【输出】

  输出画出的图形。

【输入样例】

7 7 @ 0

【输出样例】

@@@@@@@
@     @
@     @
@     @
@     @
@     @
@@@@@@@

【答案&代码】

#include 
int main(void){
	int h,d,x,i,j;
	char a;
	scanf("%d %d %c %d",&h,&d,&a,&x);
	if(x==1)
		for(int i=1;i<=h;i++,putchar('\n'))
			for(int j=1;j<=d;j++)
				printf("%c",a);
	if(x==0)
		for(int i=1;i<=h;i++,putchar('\n'))
			if(i==1||i==h)
				for(int j=1;j<=d;j++)
					printf("%c",a);
			else
				for(int j=1;j<=d;j++)
					if(j==1||j==d)
						printf("%c",a);
					else
						putchar(' ');
	return 0;
}

T1098 : 质因数分解

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  已知正整数 n n n是两个不同的质数的乘积,试求出较大的那个质数。

【输入】

  输入只有一行,包含一个正整数 n n n

  对于 60 % 60\% 60%的数据, 6 ≤ n ≤ 1000 6≤n≤1000 6n1000

  对于 100 % 100\% 100%的数据, 6 ≤ n ≤ 2 × 1 0 9 6≤n≤2×10^{9} 6n2×109

【输出】

  输出只有一行,包含一个正整数 p p p,即较大的那个质数。

【输入样例】

21

【输出样例】

7

【答案&代码】

#include
#include
int main(void){
	int p;
	scanf("%d",&p);
	for(int i=2;i<=sqrt(p);i++)
		if(p%i==0){
			p/=i;
			break;
		}
	printf("%d",p);
	return 0;
}

T1099 : 第n小的质数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  输入一个正整数 n n n,求第 n n n小的质数。

【输入】

  一个不超过 10000 10000 10000的正整数 n n n

【输出】

  第 n n n小的质数。

【输入样例】

10

【输出样例】

29

【答案&代码】

#include
#include
bool prime(int num){
	if(num==2)
		return true;
	for(int i=2;i<=sqrt(num);i++)
		if(num%i==0)
			return false;
	return true;
}
int main(void){
	int n;
	scanf("%d",&n);
	int sum=0,i;
	for(i=2;i<=1000000000;i++){
		if(prime(i))
			sum+=1;
		if(sum==n){
			printf("%d",i);
			return 0;
		}
	}
	return 0;
}

T1100 : 金币

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  国王将金币作为工资,发放给忠诚的骑士。第 1 1 1天,骑士收到一枚金币;之后两天(第 2 2 2天和第 3 3 3天)里,每天收到两枚金币;之后三天(第 4 , 5 , 6 4,5,6 4,5,6天)里,每天收到三枚金币;之后四天(第 7 , 8 , 9 , 10 7,8,9,10 7,8,9,10天)里,每天收到四枚金币…这种工资发放模式会一直这样延续下去:当连续 n n n天每天收到 n n n枚金币后,骑士会在之后的连续 n + 1 n+1 n+1天里,每天收到 n + 1 n+1 n+1枚金币( n ∈ N ∗ n\in\N^{*} nN)。

  你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。

【输入】

  一个整数(范围 1 1 1 10000 10000 10000),表示天数。

【输出】

  骑士获得的金币数。

【输入样例】

6

【输出样例】

14

【答案&代码】

#include
int main(void){
	int K;
	scanf("%d",&K);
	int sum=0;
	for(int i=1,count=0;;i+=1){
		int j;
		for(j=1;j<=i;j++){
			if(count+j>K)
				break;
			sum+=i;
		}
		if(count+j>K)
			break;
		count+=i;
	}
	printf("%d",sum);
	return 0;
}

T1101 : 不定方程求解

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  给定正整数 a , b , c a,b,c a,b,c。求不定方程 a x + b y = c ax+by=c ax+by=c关于未知数 x x x y y y的所有非负整数解组数。

【输入】

  一行,包含三个正整数 a , b , c a,b,c a,b,c,两个整数之间用单个空格隔开。每个数均不大于 1000 1000 1000

【输出】

  一个整数,即不定方程的非负整数解组数。

【输入样例】

2 3 18

【输出样例】

4

【答案&代码】

#include
int main(void){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	int MAXa=c/a,MAXb=c/b,sum=0;
	for(int i=0;i<=MAXa;i++)
		for(int j=0;j<=MAXb;j++)
			if(a*i+b*j==c)
				sum++;
	printf("%d",sum);
	return 0;
}

你可能感兴趣的:(C++语言)