为啥会出现这种情况?

对于两个正整数n, m,如果将n末尾的几个数字平移(不改变被移动的数字的顺序)到n的首端从而能得到m,则称n和m是循环的。例如(123, 312)是循环的,(123, 231)也是循环的,对于前者,你可以把末尾的3移动到12之前,从而得到312;对于后者,你可以把末尾的23移动到1之前,从而得到231。n和m的位数一定要相同,且他们都不会存在前置的0(指如01这样的数)。

现在给定正整数A、B(1<=A,B<=10000),求存在多少对循环的数(n, m),满足A<=n<m<=B。
输入
第一行一个整数N,代表有N组测试数据,接下来的N行每行第一个数为A,第二个数为B,空格分隔。
输出
N行,每行即为满足条件的循环的数对的个数。(若同一个数字n产生相了多个相同的循环数m,只算一个,如1212移动最后一个2得到2121,移动后三位也得到2121,则只计算一次2121)
提问者的代码My Code

#include<iostream>
#include<cstring>
#include<string.h>
#include<string>

using namespace std;
int main()
{
    int A, B, N, d1, c1, b1, a1, d2, c2, b2, a2; int x;
    cin >> N;
    int t[10001];
    memset(t, 0, sizeof(t));
    for (int i = 0; i < N; i++) {
        cin >> A >> B; x = 0;
        for (int n = A; n < B; n++) {

            for (int m = n + 1; m <= B; m++) {
                d1 = n / 1000; c1 = n / 100; b1 = n / 10; a1 = n - 1000 * d1 - 100 * c1 - 10 * b1;
                d2 = m / 1000; c2 = m / 100; b2 = m / 10; a2 = m - 1000 * d2 - 100 * c2 - 10 * b2;
                bool fg1 = (d1 == 0 && c1 == 0 && b1 != 0 && a1 != 0);
                bool fg2 = (d2 == 0 && c2 == 0 && b2 != 0 && a2 != 0), fg3 = (b1 == a2 && b2 == a1);
                bool fg4 = (d1 == 0 && c1 != 0),fg5 = (d2 == 0 && c2 != 0);
                bool flag1 = ((c1 == a2 && b1 == c2 && a1 == b2) || (c1 == b2 && b1 == a2 && a1 == c2));
                bool flag2 = ((d1 == a2 && c1 == d2 && b1 == c2 && a1 == b2) || (d1 == b2 && c1 == a2 && b1 == d2 && a1 == c2) || (d1 == c2 && c1 == b2 && b1 == a2 && a1 == d2));
                if (fg1) {
                    if (fg2 && fg3) { x++;  }
                    else;
                }
                else;
                if (fg4) {
                    if ( fg5 && flag1) { x++;  }
                    else;
                }
                else;
                if (d1 != 0) {
                    if (d2 != 0 && flag2) { x++;  }
                    else;
                }
                else;
            }
        }
        t[i] = x;
    }
    for (int j = 0; j < N; j++) {
        cout << t[j] << endl;
    }
}

问题
为什么有时对有时错

这代码看着就头晕啊。

已解决


#include<iostream>
#include<cstring>
#include<string.h>
#include<string>

using namespace std;
int main()
{
    int A, B, N, d1, c1, b1, a1, d2, c2, b2, a2; int x;
    cin >> N;
    int t[10001];
    memset(t, 0, sizeof(t));
    for (int i = 0; i < N; i++) {
        cin >> A >> B; x = 0;
        for (int n = A; n < B; n++) {

            for (int m = n + 1; m <= B; m++) {
                d1 = n / 1000; c1 = (n-1000*d1) / 100; b1 = (n-1000*d1-100*c1) / 10; a1 = n - 1000 * d1 - 100 * c1 - 10 * b1;
                d2 = m / 1000; c2 = (m-1000*d2) / 100; b2 = (m-1000*d2-100*c2) / 10; a2 = m - 1000 * d2 - 100 * c2 - 10 * b2;
                bool fg1 = (d1 == 0 && c1 == 0 && b1 != 0 && a1 != 0);
                bool fg2 = (d2 == 0 && c2 == 0 && b2 != 0 && a2 != 0), fg3 = (b1 == a2 && b2 == a1);
                bool fg4 = (d1 == 0 && c1 != 0),fg5 = (d2 == 0 && c2 != 0);
                bool flag1 = ((c1 == a2 && b1 == c2 && a1 == b2) || (c1 == b2 && b1 == a2 && a1 == c2));
                bool flag2 = ((d1 == a2 && c1 == d2 && b1 == c2 && a1 == b2) || (d1 == b2 && c1 == a2 && b1 == d2 && a1 == c2) || (d1 == c2 && c1 == b2 && b1 == a2 && a1 == d2));
                
                if (fg1) {
                    if (fg2 && fg3) { x++; }
                    else;
                }
                else;
                if (fg4) {
                    if ( fg5 && flag1) { x++; }
                    else;
                }
                else;
                if (d1 != 0) {
                    if (d2 != 0 && flag2) { x++; }
                    else;
                }
                else;
            }
        }
        t[i] = x;
    }
    for (int j = 0; j < N; j++) {
        cout << t[j] << endl;
    }
}