UPC-魔术数
注意数据范围10^10;
直接遍历会超时,我们采取另一种方式。条件一要求该数一定是一个平方数,就拿1-1e5的数平方后在判断,直接将次数减了一半,输入数据后需要找到两数平方根之间所有的数进行平方在遍历即可
if(floor(sqrt(a)) == sqrt(a))
{
i=x;
}
else
{
i=x+1;
}
for(;i<=y;i++)
{
//ll weishu=0;
pin=i*i;
}
注意,当输入数据是平方数是需要判断;
附上AC码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a,w,n,pin,weishu,i,ans;
ll shuzu[15];
int f(ll dai)
{
ans=1;weishu=0;
while(dai)
{
shuzu[weishu]=dai%10;
weishu++;
dai/=10;
}
if(weishu%2!=0)
{
shuzu[weishu]=10;
for(ll i=0; i<weishu; i++)
{
if(i%2)
{
if(shuzu[i]<=shuzu[i+1])
{
ans=0;
break;
}
} else {
if(shuzu[i]>=shuzu[i+1])
{
ans=0;
break;
}
}
}
}
else
{
shuzu[weishu]=11;
for(ll i=0; i<weishu; i++)
{
{
if(i%2)
{
if(shuzu[i]>=shuzu[i+1])
{
ans=0;
break;
}
}
else
{
if(shuzu[i]<=shuzu[i+1])
{
ans=0;
break;
}
}
}
}
}
if(ans)
return 1;
else
return 0;
}
int main()
{
cin >> n;
while(n--)
{
//memset(d,0,sizeof(d));
int count=0;
scanf("%lld%lld",&a,&w);
ll x=sqrt(a);
ll y=sqrt(w);
if(floor(sqrt(a)) == sqrt(a))
{
i=x;
}
else {
i=x+1;
}
for(;i<=y;i++)
{
ll weishu=0;
//int ans=1;
pin=i*i;
if(f(pin))
count++;
}
cout<<count<<endl;
}
return 0;
}
整体思想仍是暴力解决,数据范围太大,我们考虑直接对满足一个条件的数进行判断。可在输入之前进行打表,在遍历会更快。
测试数据:
1 100000000
318
1 10000000000
1149
60 70
0
121 121
1
600 1500
2