蓝桥杯题目-报纸页数/煤球数/平方怪圈/打印方格/凑算式

一.报纸页数

X星球日报和我们地球的城市早报是一样的,
都是一些单独的纸张叠在一起而已。每张纸印有4版。
比如,某张报纸包含的4页是:5,6,11,12,
可以确定它应该是最上边的第2张报纸。
我们在太空中捡到了一张X星球的报纸,4个页码分别是:
1125,1126,1727,1728
请你计算这份报纸一共多少页(也就是最大页码,并不是用了几张纸哦)?
请填写表示总页数的数字。

思路:
假设有三张报纸,则每张报纸分别为{1,2,11,12},{3,4,9,10},{5,6,7,8}
所以最大页码为 12+1-1 10+3-1 8+5-1
所以max+min-1;即1728+1125-1=2852

二.煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),

如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。

思路:
题目为:1+(1+2)+(1+2+3)+….+(1+2+…+100)=?
可用代码进行计算。

int main(){
	int i,j,sum1=0,sum2=0;
	for(i=1;i<=100;i++){  //一共100层,加100次 
		sum1=0;
		for(j=1;j<=i;j++){  //每一层总的个数 
			sum1+=j;
		}
		sum2+=sum1;
	}
	printf("%d",sum2);
	return 0;
}

运行结果:171700

三.平方怪圈

如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。

思路: 如以下代码

int main(){
	int a=135,a1=0,s=0;
	while(1){//a的循环圈 
		a1=0;
		while(a>0){//把一个正整数的每一位都平方后再求和,得到一个新的正整数。
			a1=a1+(a%10)*(a%10);
			a=a/10;
		}
		a=a1;
		if(s==a1)	break;
		else if(s<a1)
			s=a1;
	}
	printf("%d\n",s);
	return 0;
}

运行结果:145

四.打印方格

小明想在控制台上输出 m x n 个方格。
比如 10x4的,输出的样子是:
在这里插入图片描述

#include <stdio.h>
//打印m列,n行的方格 
void f(int m, int n)
{
	int row;
	int col;
	
	for(row=0; row<n; row++){
		for(col=0; col<m; col++) printf("+---");
		printf("+\n");
		for(col=0; col<m; col++) printf("|   ");
		printf("|\n");		
	}
	
	printf("+");
	_____________________________;   //填空
	printf("\n");
}

int main()
{
	f(10,4);
	return 0;
}

注意:仅仅填写划线部分缺少的内容,不要添加任何已有内容或说明性文字。

填空内容: for(col=0;col<m;col++) printf("—+")
具体分析:

void f(int m, int n){
	int row,col;
	for(row=0; row<n; row++){//打印除最后一行外的其他行 
		for(col=0; col<m; col++) printf("+---");
		printf("+\n");
		for(col=0; col<m; col++) printf("|   ");
		printf("|\n");		
	}
	printf("+");//类似于for(col=0; col<m; col++) printf("+---")
	for(col=0;col<m;col++)	printf("---+");   //填空
	printf("\n");
}

五. 快速排序

排序在各种场合经常被用到。快速排序是十分常用的高效率的算法。
其思想是:先选一个“标尺”,用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。
这样,排序问题就被分割为两个子区间。再分别对子区间排序就可以了。
下面的代码是一种实现,请分析并填写划线部分缺少的代码。

#include <stdio.h>
void swap(int a[], int i, int j){
	int t = a[i];
	a[i] = a[j];
	a[j] = t;
}
int partition(int a[], int p, int r){
    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1){
        while(i<r && a[++i]<x);
        while(a[--j]>x);
        if(i>=j) break;
        swap(a,i,j);
    }
	______________________;
    return j;
}

void quicksort(int a[], int p, int r)
{
    if(p<r){
        int q = partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    }
}
    
int main()
{
	int i;
	int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
	int N = 12;
	
	quicksort(a, 0, N-1);
	
	for(i=0; i<N; i++) printf("%d ", a[i]);
	printf("\n");
	return 0;
}

填空: swap(a,p,j);
具体:

int partition(int a[], int p, int r){
//一趟快速排序的思想, p,r为排序区间上下限,x作为标志元素-标尺
    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1){
        while(i<r && a[++i]<x);//前面部分直到遇到比标尺大才停止 
        while(a[--j]>x);	//后面部分直到遇到比标尺小才停止 
        if(i>=j) break;
        swap(a,i,j);	//前面的大和后面的小交换 
    }
	swap(a,p,j);//填空  // 将最后一次移动中小于标尺的j元素和标尺互换 
    return j;
}

六. 凑算式

这个算式中AI代表19的数字,不同的字母代表不同的数字。比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

思路:

  1. 暴力
  2. 深度优先搜寻:思路:在1~9的全排列中找符合条件的等式
#include<iostream>
using namespace std;
int ans=0,num[9];//ans=答案 
int v[10];//标记是否使用过 
void judge(){//判断条件 
    if((num[0]+(double)num[1]/num[2]+(double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]))==10)
        ans++;
    return;
}
void dfs(int i){//i为num[]的第i位 
    if(i==8+1){//i==8+1表示num数组中的前8个已经放置好数字 
        judge();
        return;
    }
    for(int j=1;j<10;j++){
        if(v[j]==0){//判断数字是否使用过 
            v[j]=1;
            num[i]=j;
            dfs(i+1);//进行下一个数字的放置 
            v[j]=0;//回溯,当满足一种全排列后,进行下一种尝试
        }
    }
}
int main(){
    dfs(0);
    cout<<ans<<endl;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凝聚细沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值