第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)(热身赛) A-2020
2020 is a special integer, it's formed of two same integers (20 and 20).
We call a number is a good number, if and only if it can be formed of two same integers(without leading zero).
For example: 2020 11, 19991999 are good numbers, but 303, 1122, 1221 are not.
Now you need to count the number of good numbers in ([1,N])
题意
给出一个 <=1e18 的n 求从1到n中有多少个数是由两个相同的数构成的。
思路
输入字符串写出打表程序,发现
奇数时答案为s.size()/2 个9
偶数时把字符串分成两半,如果后面的数大于等于前面的,就输出前面的数,否则把字符串转换为数减一后输出。
代码
打表代码
#include <bits/stdc++.h>
using namespace std;
bool ok(string s)
{
int len = s.size();
if(len & 1) return false;
string now1 = "" , now2 = "";
for(int i=0;i<len/2;i++)
now1 += s[i];
for(int i=len/2;i<len;i++)
now2 += s[i];
// cout<<now1<<" "<<now2<<endl;
return now1 == now2;
}
int main()
{
//ok("1111");
int ans = 0;
for(int i=1;i<=10000;i++)
{
stringstream ss;
string s;
ss<<i;
ss>>s;
if(ok(s)) ans++;
cout<<i<<" "<<ans<<endl;
}
}
AC代码
#include <bits/stdc++.h>
using namespace std;
bool ok(string s)
{
int len = s.size();
if(len & 1) return false;
string now1 = "" , now2 = "";
for(int i=0;i<len/2;i++)
now1 += s[i];
for(int i=len/2;i<len;i++)
now2 += s[i];
// cout<<now1<<" "<<now2<<endl;
return now1 == now2;
}
int main()
{
string s;
cin>>s;
int len = s.size();
if(len & 1)
{
int l = len/2;
for(int i=0;i<l;i++) cout<<"9";
}
else
{
string now1 = "" , now2 = "";
for(int i=0;i<len/2;i++)
now1 += s[i];
for(int i=len/2;i<len;i++)
now2 += s[i];
if(now2>=now1) cout<<now1<<"
";
else
{
stringstream ss;
ss<<now1;
int n;
ss>>n;
n--;
cout<<n<<"
";
}
}
}
/*
1000000
999
10000
99
100
9
*/