zoj3622Magic Number
2013-11-16 20:09
344 查看
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.
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); } }
相关文章推荐
- Intent的属性及Intent-filter配置——指定Action、Category调用系统Activity
- C语言变量、函数的作用域及变量的存储方式
- 复制构造函数
- Struts2在MyEclipse9.0上的一些错误
- JAVA学习.JAVA面向对象编程的理解&Random类
- cURL实现Get和Post
- 一步一步学Silverlight 2系列(12):数据与通信之WebClient
- NSIS打包发布Qt程序
- C语言写CGI程序
- 磁盘分区
- 机房收费系统—组合查询
- Asterisk manager API(AMI)文档(中文版)
- 关于哈希码(Hashcode)
- 闪回查询&闪回版本查询&闪回表&闪回事务处理
- 线程池
- CGI之C语言篇
- 阅读程序的方法
- 谷歌Nexus系列手机演进之路
- problem20
- HDU 1033