第 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


*/
原文地址:https://www.cnblogs.com/liangyj/p/14195190.html