蓝桥杯自用

本文汇总了历年编程竞赛的第三题,包括蛇形填数、数列求值、乘积尾零、承压计算、算式求解、三羊献瑞、李白打酒等题目,展示了各种算法思路和解决方案,适合编程爱好者学习和练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三题

2020第三题:蛇形填数

题目描述
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?

1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …

代码思路:就是求对角线,1,5,13,25,41……

1

1+4

5+4*2

13+4*3

25+4*4 

#include<iostream>
#include<bits/stdc++.h> 
using namespace std;

int main()
{
	int i,n=20;
	int sum=1;
	for(i=0;i<n;i++){
		sum=sum+4*i;
	}
	cout<<sum;
	return 0;
}

答案761 

2019第三题:数列求值(10分)
题目描述

给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。
题目分析
用数组保存三项值,通过对3取余依次将数字加上去。应为保留最后四位数字,所以每次计算过后需要用10000取余,不然会溢出

#include <iostream>
using namespace std;
int main()
{
    int a, b, c, d;
    a = b = c = 1;
	for (int i = 4; i <= 20190324; i++)
	{
		d = (a + b + c) % 10000;
		a = b;
		b = c;
		c = d;
	}
    cout << d << endl;
    return 0;
}

答案4659

2018第三题:乘积尾零
题目描述

如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211

注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容。

代码分析:乘积尾零就是为了凑10,10=2*5,所以把所有的乘数拆成2和5的倍数,就可以求得有多少个零。

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int num5,num2,x;
	num5=0;
	num2=0;
	for(int i=0;i<100;i++){
		cin>>x;
		if(x==0)cout<<"0"<<endl;
		while(1){
			if(x%5==0){
				num5++;
				x/5;
			}
			if(x%2==0){
				num2++;
				x/2;
			}
			else{
				break;
			}
		}
	}
	cout<<min(num5,num2)<<endl;
	return 0;	
}
 

2017

第三题:承压计算(13分)

题目描述
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。

                             7
                            5 8
                           7 8 8
                          9 2 7 2
                         8 1 4 9 1
                        8 1 8 8 4 1
                       7 9 6 1 4 5 4
                      5 6 5 5 6 9 5 6
                     5 5 4 7 9 3 5 5 1
                    7 5 7 9 7 4 7 3 3 1
                   4 6 4 5 5 8 8 3 2 4 3
                  1 1 3 3 1 6 6 5 5 4 4 2
                 9 9 9 2 1 9 1 9 2 9 5 7 9
                4 3 3 7 7 9 3 6 1 3 8 8 3 7
               3 6 8 1 5 3 9 5 8 3 8 1 8 3 3
              8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9
             8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4
            2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9
           7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6
          9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3
         5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9
        6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4
       2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4
      7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6
     1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3
    2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8
   7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
  7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。电子秤的计量单位很小,所以显示的数字很大。
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。

代码分析:输入二维数组,自上而下的处理a[i][j]*factor(2的30次方)除以2,计入a[i+1][j]和a[i+1][j+1]
循环处理2~n-1行。xxx是第30行,最远处理到28即可
对a[n-1]行排序,查看最小值余factor之间的倍数关系,求出最大值。 

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
#include<cmath> 
typedef long long LL;

LL arr[30][30];
int main(int argc, const char * argv[]) {
    LL factor=1;
    for (int i = 0; i < 30; ++i) {
        factor<<=1;
    }
//  输入 
    for (int i = 0; i < 29; ++i) {
        for (int j = 0; j <= i; ++j) {
            LL a=0;
            scanf("%lld",&a);
            arr[i][j]=a*factor;
        }
    }

//平分数据 
    for (int i = 0; i < 29; ++i) {
        for (int j = 0; j <=i ; ++j) {
            LL ha =arr[i][j]/2;
            arr[i+1][j]+=ha;
            arr[i+1][j+1]+=ha;
        }
    }
//排序 
    sort(arr[29],arr[29]+30);
    cout<<arr[29][0]/2<<","<<arr[29][29]/2<<endl;
    return 0;
}

 2086458231,72665192664

2016

       B       DEF
A +    —    +  ——— = 10
       C       GHI

(如果显示有问题,可以参见【图1.jpg】)
这个算式中AI代表19的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

int main()
{
	int num[9] = {1,2,3,4,5,6,7,8,9};
	int cnt = 0;
	do
	{
		float a = num[0];
		float b = num[1]*1.0/num[2];
		float c = (num[3]*100.0+num[4]*10+num[5]) / (num[6]*100+num[7]*10+num[8]);
		
		if(fabs(a+b+c-10)<=1e-5)
		{
			cnt++;
		}
	}while(next_permutation(num,num+9));
	cout << cnt <<endl;
	return 0;
}

29

2015

第三题:三羊献瑞
题目描述

观察下面的加法算式:

    祥 瑞 生 辉
  + 三 羊 献 瑞
-------------------
 三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	//num[0]~num[6]分别代表 祥 瑞 生 辉 羊 献 气 
	int num[9] = {0,2,3,4,5,6,7,8,9};
	do
	{
		if(num[0]!=0)
		{
			int a = num[0]*1000 + num[1]*100 + num[2]*10 +num[3];
			int b = 1*1000 + num[4]*100 + num[5]*10 + num[1];
			int c = 1*10000 + num[4]*1000 + num[2]*100 + num[1]*10 + num[6];
			if(a+b == c)
			{
				cout << "1" << num[4] << num[5] << num[1] <<endl;
				break;
			}
		} 
	}
	while(next_permutation(num,num+9));
	return 0;
}
1085

2014

第三题:李白打酒
题目描述

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

#include<stdio.h>
int sum;
//x表示还有几次遇到店的机会
//y表示还有几次遇到花的机会
//c表示当前酒的斗数
int f(int x,int y,int c)
{
	
    if(x<0||y<0)
    return 0;

    if(x==0&&y==1&&c==1)//临界条件 
    sum+=1;

    //如果遇到酒店
    if(x>0) 
    f(x-1,y,c*2);

    //如果遇到花
    if(y>0) 
    f(x,y-1,c-1);
    return 0; 
}
int main()
{
    f(5,10,2);
    printf("%d",sum);
    return 0;
}

 答案14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值