ZCMU-1445-Repeat Number

来源:互联网 发布:google云端硬盘知乎 编辑:程序博客网 时间:2024/05/17 09:28

1445: Repeat Number

Time Limit: 1 Sec  Memory Limit: 32 MB
Submit: 184  Solved: 49
[Submit][Status][Web Board]

Description

Definition: a+b = c, if all the digits of c are same ( c is more than ten)then we call a and b are Repeat Number. My question is How many Repeat Numbers in [x,y].

Input

There are several test cases.

Each test cases contains two integers x, y(1<=x<=y<=1,000,000) described above.

Proceed to the end of file.

Output

For each test output the number of couple of Repeat Number in one line.

Sample Input

1 10
10 12

Sample Output

5
2

HINT


If a equals b, we can call a, b are Repeat Numbers too, and a is the Repeat Numbers for itself.


【解析】

这道题一开始没看懂是什么意思,后来才知道原来是在它所给的范围当中寻找能不能组成比如各个位数相同的比如说11,22,33,44,55这些数。那比如说样例1给的是1到10,这些个数当中有那些可以组成11的吗。比如说1和10,2和9,3和8,4和7,5和6。这些都是那么我们这样可以这么算呢,经过大佬点播,其实我们先可以把各个位数相同的数我们都先列举出来。因为总共也就到10的6次方其实还是很好列的。然后我们要找到一个各个位数都相同的比2*x大的,从这个开始我们就可以开始凑了,不过大家要注意的是我们的那个各个位数都相同的那个数不能比2*y都大,因为比它都大的话我们根本不可能达到的所以没有必要再去凑那个数了。那么我们先定义各个位数都相同的数存在一个num数组当中。那么在num[i]小于x+y的和的时候,我们举个例子我们拿当num[i]=11的时候,x为3,y为9的时候,这个时候11减3为8,也就是说我们要凑出11来,y最大取8,那么我们这个时候想啊4和7可以,5和6可以这个是不是就相当于是3,4,5,6,7,8也就是说我们把11减3再减3然后+1就能得到那几个可以凑出元素的的个数了。这是一种情况。另外一种情况是num[i]>x+y,这个时候我们要算出x的边界值最小要取多少。比如我们这个时候x取2,y取8.这样的话11是大于2加8的,那我们这个时候把x取最小的情况求出来是3,然后我们可以就在3和8这6个数当中凑出能成为11的。然后我们就可以推出这个得到的重复数的个数了。这里如果得到的数据个数不是偶数的话我们要把数据个数除2之后加1,因为那一个就是两个相同的数所组成的,比如当num[i]为22的时候,我们x为4,y为18的时候,我们能凑成22的那就是4和18,5和17,6和16,7和15,8和14,9和13,10和12,11和11.就是多出来的这11的那种情况。

#include<stdio.h>int main(){    int num[1000]={11,22,33,44,55,66,77,88,99,111,222,333,444,555,666,777,888,999,1111,2222,3333,4444,5555,6666,7777,8888,9999,11111,22222,33333,44444,55555,66666,77777,88888,99999,111111,222222,333333,444444,555555,666666,777777,888888,999999,1111111};    int x,y;    while(~scanf("%d %d",&x,&y))    {        int sum=0,j,i;        for(i=0;num[i]<x*2;i++)        {            if(num[i]>=x*2) //先判断它所能达到的最小的值                break;        }        for(j=i;num[j]<=y*2&&num[j]!=0;j++)//必须满足num[j]<=2*y        {            if(num[j]-x<=y)//此情况就是所讲的求右边界最大取多少            {                int n=num[j]-x-x+1;                if(n%2==0)                {                    sum+=n/2;                }                else                {                sum+=n/2+1;                }            }            else            {                int n=y*2-num[j]+1;//求左边界最小取多少这里其实就是(y-num[j])这里算的是取的最小                if(n%2==0)                {                    sum+=n/2;                }//然后y-(y-num[j])+1是s算元素的个数之所以加1是把边界也算上了                else                {                    sum+=n/2+1;//如果所得到的的数据元素是奇数那就整除+1                }            }        }        printf("%d\n",sum);    }    return 0;}

0 0
原创粉丝点击