Algorithm 如何解决此代码中的超时问题?

Algorithm 如何解决此代码中的超时问题?,algorithm,timeout,Algorithm,Timeout,我需要帮助。问题是在镜子里照耀时,如何找到一个对称的数字。(例如0、1、11、101、1521(o),但1221和1010不是。) 两个数字A和B之间有空格。(输入) 范围为0您经历了一个非常痛苦的过程,以查看所有数字中哪些是镜像。卢卡斯·巴特走上了正确的道路,但比这还要快。你不需要构造数字;数一数有多少 首先,你根本不在乎数字的后半部分;通过构造,给定左半部分,右半部分是唯一的。因此,您所要做的就是计算每个数字长度的左半部分。这将解决完全包含在范围内的10次方的所有计数问题 这使它容易得多。对

我需要帮助。问题是在镜子里照耀时,如何找到一个对称的数字。(例如0、1、11、101、1521(o),但1221和1010不是。) 两个数字A和B之间有空格。(输入)
范围为0您经历了一个非常痛苦的过程,以查看所有数字中哪些是镜像。卢卡斯·巴特走上了正确的道路,但比这还要快。你不需要构造数字;数一数有多少

首先,你根本不在乎数字的后半部分;通过构造,给定左半部分,右半部分是唯一的。因此,您所要做的就是计算每个数字长度的左半部分。这将解决完全包含在范围内的10次方的所有计数问题

这使它容易得多。对于只有部分数字的范围(即A和/或B不是10的幂),必须限制范围一端或另一端的前导数字

你被允许前导零。因此,每个数字有五种可能:0、1、8、2、5。如果您有奇数位数,那么中间的数字必须是它自己的镜像:0、1、8

让我们看一个例子,4位数字和5位数字。对于4位数字,您只需要前两位。每个数字有5种可能。这将产生5*5或
25个四位镜像编号

现在将其扩展为5位数字。你已经知道有25个两位数的开始。添加三个合法中间数字中的一个,即3*25,或
75个五位数镜像号码


将此扩展到完整的解决方案留给学生作为练习。

首先:您的问题格式非常糟糕,几乎无法阅读。请改进一下。回答你的问题:我猜问题的解决方案不是不检查A和B之间的所有数字,而是只生成具有所需属性的数字,即只生成不包含任何不可镜像数字的数字。
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("%d\n",cnt);
    return 0;
}