• CCNUOJ 1010 The Almost Lucky Numbers


    1010: The Almost Lucky Numbers

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 16  Solved: 11
    [Submit][Status][Web Board]

    Description

    John and Brus believe that the digits 4 and 7 are lucky and all others are not. According to them, an almost lucky number is a number that contains at most one non-lucky digit in its decimal representation. Return the total number of almost lucky numbers between a and b, inclusive.

    Input

    Each line contains two integers a,b<=1,000,000

    Output

    For each line of input,output the total number of almost lucky numbers between a and b, inclusive.

    Sample Input

    4 7 8 19

    Sample Output

    4 4

    思路:数据不大,直接搜即可。或者另一种方法,排列组合,不成熟,当搜索的数和当前数位数相同的时候没想出来怎么算
    #include<stdio.h>
    int l(int x)
    {
    	int cnt(0);
    	while(x>0) {x/=10;cnt++;}
    	return cnt;
    }
    bool is(int x)
    {
    	bool y(true);
    	while(x>0)
    	{
    		if(!(x%10==4||x%10==7)) 
    		{if(y) y=!y;else return false;}
    		x/=10;
    	}
    	return true;
    }
    int main()
    {
    	int x,y,t,i,a,lx,ly;
    	int e[9],u[9];
    	e[0]=1;u[0]=1;e[1]=1;
    	for(i=1;i<9;i++)
    	{
    		u[i]=u[i-1]*2;
    	}
    	for(i=2;i<9;i++)
    	{
    		e[i]=e[i-1]*10;
    	}
    	while(scanf("%d%d",&x,&y)==2)
    	{
    		a=0;
    		if(x>y) {t=x;x=y;y=t;}
    		lx=l(x);ly=l(y);
    		if(ly-lx>=2)
    		{
    			for(i=lx+1;i<=ly-1;i++)
    			{
    				a+=u[i]+8*u[i-1]*i-u[i-1];
    			}
    			for(i=x;i<e[lx+1];i++)
    			{
    				if(is(i)) a++;
    			}
    			for(i=e[ly];i<=y;i++)
    			{
    				if(is(i)) a++;
    			}
    		}
    		else
    		{
    			for(i=x;i<=y;i++)
    			{
    				if(is(i)) a++;
    			}
    		}
    		printf("%d\n",a);
    	}
    	return 0;
    }
    

      


  • 相关阅读:
    第十二章类的无参方法
    第十三章人机猜拳
    第十一章类和对象
    面向对象七大原则。
    深入类的方法。
    使用集合组织相关数据。
    .NET框架
    C#数据类型
    错误。
    实现Windows的数据绑定
  • 原文地址:https://www.cnblogs.com/laputa/p/2127035.html
Copyright © 2020-2023  润新知