蓝桥杯第六届(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]