对于两个正整数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;
}
}
问题
为什么有时对有时错