题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722
Good Numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5577 Accepted Submission(s): 1769
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: 1
Hint
The answer maybe very large, we recommend you to use long long instead of int.
题目大意:两个数a,b从a到b,找出其中所有每位数字相加之和可以被10整除的数字的个数。
因为数据范围很大,所以肯定不能遍历,因此必定会有规律:
分析:
由题得知:个位数是必定不可能的;
十位数有9个;
剩下的:每一位必定有其他的位能凑成10的倍数例如:100后的可1-9以及对应的(9-1)-(9-9),查看可以组合的数字;
因此可以得出是每10个数会出现一个符合要求的数字
因此前n个数必定有n/10个数是符合要求的数,然而这只判断了n忽略了个位数,因此加上个位数还有:一个n-n%10-n之间的判断,符合要求++;
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
//#include<map>
#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define da 0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件
ll judge(ll x)
{
int sum=0;
while(x)
{
sum=sum+x%10;
x=x/10;
}
return sum;
}
ll f(ll x)
{
ll sum=0;
sum=sum+x/10;
for(ll i=(x-x%10);i<=x;++i)
{
if(judge(i)%10==0)
{
sum++;
break;
}
}
return sum;
}
int main()
{
int t,top=1;
cin>>t;
while(t--)
{
ll a,b;
cin>>a>>b;
cout<<"Case #"<<top++<<": "<<f(b)-f(a-1)<<endl;//注意a也是要判断的数
}
}