题意:给你一个区间[L,R],区间内的每个数x都可以用x=Anx10^n +An-1x10^n-1+......+A1x10+A0;其中偶数位之和-奇数位之和=3,Hanamichi这个人找到了规律,并且写了一个公式Answer = (R + 8) / 11 – (L – 1 + 8) / 11,现给你一个区间,证明区间内的符合条件的元素个数与用公式计算的符合条件的个数是否一样,即验证公式的正确性如果正确输出-1,如果不正确输出那个导致结果不正确的最小的元素。
解题思路:本题给的数据不大,所以可用暴力求解,即将区间内的每个元素分解判断是否符合条件,然后计数,最后得到的结果与计算公式的结果进行对比,只要出现不一致的直接跳出,详见代码。
Code:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
int main()
{
//freopen("input.txt","r",stdin);
int T;
LL L,R,num,flag;
LL e_num,o_num,sum;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&L,&R);
LL i,temp,cnt = 0;
for(i = L; i <= R; i++)
{
num = i; flag = 1; sum = 0;//将区间内的每一个数都赋给num
e_num = 0; o_num = 0;
while(num)//然后对区间内的每个数num进行分割
{
sum +=(num%10)*flag;//奇数位为负,偶数为正,用flag进行调整
if(flag == 1) e_num +=num%10;//e_num表示偶数位相加之和,当flag为正时,进行偶数位相加,
else o_num +=num%10;//o_num表示奇数位相加之和,当flag为负时,进行负数位相加
flag *=-1; num /=10;//对flag乘以-1来进行奇偶变换
}
if(e_num > o_num && sum == 3) cnt++;//统计每次的区间内符合条件的个数
temp = (i+8)/11-(L+7)/11;//利用公式计算此时区间里符合条件的个数
if(temp != cnt) break;//如果有一个跟计算公式的结果不同,就直接跳出
}
if(temp == cnt) printf("-1\n");
else printf("%I64d\n",i);
}
return 0;
}