A
解题思路:如果长度是奇数,直接输出NO,否则将字符串分成等长的两个字符串,然后将两个字符串进行比较。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int main()
{
int T;
cin>>T;
char s[105];
while(T--)
{
cin>>s;
int len=strlen(s);
if (len%2)
{
cout<<"NO"<<endl;
continue;
}
bool flag=true;
for (int i=0;i<len/2;i++)
{
if (s[i]!=s[len/2+i])
{
flag=false;
break;
}
}
if (flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B
解题思路:一开始是想着直接开平方和开立方然后求和,但考虑到有的数可能会相同而且10^9开方和开平方并不大,所以就用枚举和set集合来求出符合条件的数。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <set>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
long n;
cin>>n;
set<int> a;
for (int i=1;i<=n;i++)
{
if (i*i<=n) a.insert(i*i);
else break;
}
for (int i=1;i<=n;i++)
{
if (i*i*i<=n) a.insert(i*i*i);
else break;
}
cout<<a.size()<<endl;
}
return 0;
}
C
题解:a的每一位数加上b的每一位数组成了s,那么只需要用s从后往前枚举一位s[j]减去枚举的a的一位a[i],当s[j]小于a[i],就要判断s[i-1]是不是为1,因为两个0到9的数相加小于20如果s[i-1]不是1那么证明不存在b。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <set>
using namespace std;
int main()
{
int T;
cin>>T;
while (T--)
{
long long a,s,x,y;
long long b=0,p=1;
cin>>a>>s;
bool flag=true;
while(a>0)
{
x=a%10;
y=s%10;
if(y<x)
{
s/=10;
y+=s%10*10;
if (s%10!=1)
{
flag=false;
break;
}
}
b+=p*(y-x);
a/=10,s/=10,p*=10;
}
if(flag)
{
b+=p*s;
cout<<b<<endl;
}
else cout<<-1<<endl;
}
return 0;
}
D~H无力更新,到后面有能力了再更