我需要帮助。 问题是在镜子里发光时找到一个对称的数字。(例如0,1,11,101,1521(o),但1221和1010不是。 在此处输入图像描述 给出两个数字 A 和 B 之间有空格。(输入) 范围为 0<=A, B<=10^18。
输出是从 A 到 B 的打印对称数字计数。
例如) 0 100(输入) 7(输出)
这是我在 C++ 中的代码,但由于数字范围很广,此代码发生了超时。 如何解决这个问题?
int main()
{
scanf("%d %d", &n,&m);
for(int i=n;i<=m;i++)
{
char s[19];
n=i;
int len=0;
do{
s[len++]=n%10;
n/=10;
} while(n>0);
len--;
int j = 0;
for(j=0;j<=len/2;j++)
{
if(s[j]==s[len-j] && (s[j]==1 || s[j]==8 || s[j]==0))
continue;
if( (s[j]==2 && s[len-j]==5) || (s[j]==5 && s[len-j]==2))
continue;
break;
}
if(j>len/2)
cnt++;
}
printf("%dn",cnt);
return 0;
}
你经历了一个非常痛苦的过程,看看所有数字中哪些是镜子。 卢卡斯·巴特(Lukas Barth)走在正确的轨道上,但它甚至比这更快。 你不需要构建数字;数一数有多少。
首先,你根本不在乎数字的后半部分;通过构造,给定左半部分,右半部分是唯一的。 因此,您所要做的就是计算每个数字长度的左半部分。 这将解决完全包含在范围内的 10 次幂的所有计数。
这使它变得容易得多。 对于您只有部分数字的范围(即 A 和/或 B 不是 10 的幂),您必须限制范围一端或另一端的前导数字。
您可以使用前导零。 因此,每个数字有五种可能性:0、1、8、2、5。如果你有一个奇数位数,那么中间的数字必须是它自己的镜像:0、1、8。
因此,让我们看一个例子,4位和5位数字。 对于 4 位数字,您只需要前两个。 每个数字都有 5 种可能性。 这会产生 5*5,即25 four-digit mirror numbers
。
现在将其扩展到 5 位数字。 您已经知道正好有 25 个两位数的开始。 添加三个法定中间数字中的一个,得到 3*25,即75 five-digit mirror numbers
。
将其扩展到完整的解决方案留给学生作为练习。