题意:输入一个n,求从中任选两个数,使得其尾部9的个数最多的数对有多少个。(也可能存在0个9) n ≤ 10^9
例:n=14:1 and 8;2 and 7;3 and 6;4 and 5;5 and 14;6 and 13;7 and 12;8 and 11;9 and 10。
思路:刚开始我是想找规律的,然后发现规律是有的,太难表述出来了。看了别人的题解知道,这应该从另一角度来思考,比如最多的9的个数是2,那么就要构造出99,199,299,…,899,考虑满足和是这些的数对有几个,然后发现自己读错题了…是可以出现一个数被选多次的…
以两个9为例:
99:1+98…49+50——50~98都可以凑出99
199——100~198都可以凑出199
……
899——450~898都可以凑出899
然后就可以写了,注意特判2~4。
代码:
int main()
{
long long n;
scanf("%lld",&n);
int num=0;//9的最大个数
long long zs=5;
if(n<=4)
{
if(n==2)printf("1\n");
else if(n==3)printf("3\n");
else if(n==4)printf("6\n");
return 0;
}
for(int i=1;i<=9;i++)
{
if(n<zs)break;
zs=zs*10;num++;
}
//printf("num=%d\n",num);
long long l=5;long long r=10;
for(int i=0;i<num-1;i++)
l=l*10,r=r*10;
long long sl=l,sr=r;
r=r-2;
long long ans=0;
for(int i=0;i<9;i++)
{
if(n<l)break;
else if(n>=r)ans+=r-l+1;
else if(n>=l)ans+=(n-l)+1;
l=l+sl;r=r+sr;
}
printf("%lld\n",ans);
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!