zoj3622Magic Number

A positive number y is called magic number if for every positive integerx it satisfies that puty to the right ofx, which will form a new integerz, z mod y = 0.

Input

The input has multiple cases, each case contains two positve integers m,n(1 <=m <=n <= 2^31-1), proceed to the end of file.

Output

For each case, output the total number of magic numbers between m andn(m,n inclusively).

Sample Input
1 1
1 10
Sample Output
1
4
解出题目:求满足这样的条件:给出两个数m,n,m<=y<=n; y与x组成一个数z=xy,x为高位,y为低位,x为任意数,设y有len位,则z=(x*pow(10,len)+y);那么要z%y=0; => (x*pow(10,len))%y=0;用数学归纳法:x=1时pow(10,len)%y=0成立,假设x=x时(x*pow(10,len))%y=0也成立,则x=x+1时,有((x+1)*pow(10,len))%y => x*pow(10,len)%y+pow(10,len)%y=0,所以也成立。所以可以去掉x,推得 pow(10,len)=k*y; => y=pow(10,len)/k&&pow(10,len)%k==0;这样便可以保证y为整数;再计算时,yy=pow(10,len)/k,如果yy的位数为len则赋值y=yy; 题目是求出满足这样条件的y有多少个。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
long long num[100];
void init()
{
    int len,k;
    long long ans=1;
    n=0;
    for(len=1;len<=11;len++)
    {
        ans*=10;//ans=pow(10,len);
        for(k=1;k<=10;k++)
        if(ans%k==0&&ans/k>=ans/10&&ans/k<ans)//y=ans/k
        num[++n]=ans/k;
    }
    sort(num+1,num+1+n);//从小到大排
}
int main()
{
    int k;
    long long l,r;
    init();
    while(scanf("%lld%lld",&l,&r)>0)
    {
        k=0;
        for(int i=1;i<=n;i++)
        if(num[i]>=l&&num[i]<=r)
            k++;
        printf("%d\n",k);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值