Good Numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3679 Accepted Submission(s): 1166
Problem Description
If we sum up every digit of a number and the result can be exactly divided by 10, we say this number is a good number.
You are required to count the number of good numbers in the range from A to B, inclusive.
You are required to count the number of good numbers in the range from A to B, inclusive.
Input
The first line has a number T (T <= 10000) , indicating the number of test cases.
Each test case comes with a single line with two numbers A and B (0 <= A <= B <= 10 18).
Each test case comes with a single line with two numbers A and B (0 <= A <= B <= 10 18).
Output
For test case X, output "Case #X: " first, then output the number of good numbers in a single line.
Sample Input
2 1 10 1 20
Sample Output
Case #1: 0 Case #2: 1HintThe answer maybe very large, we recommend you to use long long instead of int.
题解:这一题可以用规律来找...首先判断1~a中满足要求的一定是a/10 或a/10-1,如果(a/10)*10~a中有满足题目要求的数,就可以不减1,否则减一。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T,t;
long long ansa,ansb,ans,a,b;
int solve(long long x)
{
int t=x%10,f=0,k,i=0;
x=x-t;
x=x/10;
while (x!=0)
{
k=x%10;
x=x-k;
x=x/10;
f+=k;
}
while (f%10!=0)
{
i++;
f+=1;
}
if (i==t) return 2;
if (t>i) return 1;
else return 0;
}
int main()
{
scanf("%d",&T);
t=T;
while (T--)
{
scanf("%I64d%I64d",&a,&b);
ansa=a/10;
if (!solve(a)) ansa--;
ansb=b/10;
if (!solve(b)) ansb--;
ans=ansb-ansa;
if (solve(a)==2) ans++;
printf("Case #%d: %I64d\n",t-T,ans);
}
return 0;
}