[蓝桥杯解题报告]第六届蓝桥杯大赛省赛2015(软件类)真题C++A组 Apare_xzc

蓝桥杯第六届(2015年)省赛软件类C++A组解题报告

Apare_xzc 2020/3/12


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1. 方程整数解

在这里插入图片描述

分析:

        dfs即可。0^2 + 10^2 +30^2 = 1000

代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
   
	for(int i=0; i<=40; ++i) 
		for(int j=i; j<=40; ++j) 
			for(int k=j; k<=40; ++k) 
				if(i*i+j*j+k*k==1000) {
   
					cout<<i<<" "<<j<<" "<<k<<endl;
					return 0; 
				}
	return 0;
}
这题我找到的解是0*0 + 10*10 + 30*30 = 1000,所以我的答案是0

在这里插入图片描述


2. 星系炸弹

在这里插入图片描述

分析:

        这个题可以直接数出来。到2014年11月30日,过了30 - 9 = 21(天),到2014年12月31日,过了21 + 31 = 52(天),那么到2016年12月31日,过了52 + 365 + 366 = 783(天),还有1000 - 783 = 217(天)。大概217天是7个月,2017年前7个月的天数之和为:31 + 28 + 31 + 30 + 31 + 30 + 31 = 212(天), 那么还有217 - 212 = 5(天),答案就是2017-08-05 。
        当然我们也可以写程序。写一个函数,给定当前日期和增加的天数,返回若干天以后的日期。代码如下。

代码:
#include <bits/stdc++.h>
using namespace std;
int md[] = {
   0,31,28,31,30,31,30,31,31,30,31,30,31};
bool Leap(int y) {
   
	if(y%400==0||y%4==0&&y%100) return 1;
	return 0;
}
int getMonthDay(int y,int m) {
   
	if(m!=2) return md[m];
	return md[m]+Leap(y);
}
void add(int &y,int &m,int &d,int add) {
   
	int monthday = getMonthDay(y,m),yday;
	if(d+add<=monthday) {
   
		d += add; return;
	}
	add -= monthday-d;
	d = monthday;
	for(int i=m+1; i<=12; ++i) {
   
		monthday = getMonthDay(y,i);
		if(add>=monthday) m = i, d = monthday, add -= monthday;
		else break;
	}
	if(add==0) return;
	if(m<12) {
   
		++m; d = add; return;
	}
	for(int i=y+1;; ++i) {
   
		yday = 365+Leap(i);
		if(add>=yday) add -= yday,++y;
		else break;
	}
	if(add==0) return;
	++y;
	if(add<=31) {
   
		m = 1; d = add; return;
	}
	for(int i=1; i<=12; ++i) {
   
		monthday = getMonthDay(y,i);
		if(add>=monthday) m = i, d = monthday, add-=monthday;
		else break;
	}
	if(add==0) return;
	if(m==12) m = 0;
	++m; d = add;
	return;
}
int main() {
   
	int y = 2014, m = 11, d = 9, i=1000;
	add(y,m,d,i);
	printf("%04d-%02d-%02d\n",y,m,d);
	return 0;
}
答案为:2017-08-05

在这里插入图片描述


3. 奇妙的数字

在这里插入图片描述

分析:

        因为立方在十位数之内,所以这个数并不大,暴力找就好了。

代码:
#include <bits/stdc++.h>
using namespace std;
bool f(int x) {
   
	int cnt[10] = {
   0};
	long long y = x*x;
	long long z = y*x;
	map<int,int> mp;
	while(y) cnt[y%10]++,y/=10;
	while(z) cnt[z%10]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值