2015年省赛A组C++
A、方程整数解 三重循环暴力
方程:a^2 + b^2 + с^2 = 1000这个方程有正整数解吗?
有:a,b,c=6,8,30 就是一组解。你能简出另一组合适的解吗?
请填写该解中最小的数字。
10:按等式条件求得10,18,24
int main(){
int i,j,k;
for (i=1;i<1000;i++){
for (j=i;j<1000;j++){
for (k=j;k<1000;k++){
if (i*i+j*j+k*k==1000){
cout<<i<<" "<<j<<" "<<k<<endl;
}
}
}
}
return 0;
}
B、星系炸弹 日期计数
在X星系的广裹空间中漂浮着许多X星人造“炸弹”,阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。
比如:2015-02-19
2017-08-05:思路同2013A高斯日记,去掉年末从新一年年初开始算
bool isrun(int x){ //是否闰年
if (x%400==0) return true;
if (x%100 && x%4==0) return true;
return false;
}
int main(){
int year=2015,month=1,in=1000-21-31;//从2015年算
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//哪一年
while (1){
if (isrun(year)&&in>365) in-=366;
else if (!isrun(year)&&in>=365) in-=365;
else break;
year+=1;
}
//哪一月
if (isrun(year)) m[4]=29;
while (1){
if (in>=m[month]) in-=m[month++];
else break;
}
cout<<year<<"-0"<<month<<"-0"<<in;
return 0;
}
C、奇妙的数字 根据规则暴力找数字
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?
69:使用map的find和size即可
map<int,int> have;
bool isfind(int x){
int a=x*x,b=x*x*x;
have.clear();
while (a){//平方
if (have.find(a%10)==have.end())
have[a%10]=1;
else return false;
a/=10;
}
while (b){//立方
if (have.find(b%10)==have.end())
have[b%10]=1;
else return false;
b/=10;
}
if (have.size()==10) return true;
return false;
}
int main(){
int i=13;
while (1){//暴力找数字
if (isfind(i)){
cout<<i;
break;
}
else i+=1;
}
return 0;
}