黑马程序员技术交流社区
标题:
1000!中含有多少零?
[打印本页]
作者:
邵景伦
时间:
2014-3-21 11:21
标题:
1000!中含有多少零?
本帖最后由 何伟超 于 2014-3-23 00:31 编辑
1*2*3*4....*999*1000中含有多少零?
作者:
小武8686886
时间:
2014-3-21 13:03
我也在做这个题 我也想问问 1000!的末尾有几个零呢
作者:
Aimer_WJY
时间:
2014-3-21 13:08
这个好像定义长整型都存不下。大概在66的时候就溢出了。
public class Demo {
public static void main(String [] args)
{
long sum=1l;int count=0;
for(int i=1;i<=65;i++)
{
sum=i*sum;
}
System.out.println(sum);
}
}
结果:-9223372036854775808
求大神指导吧
作者:
青木郎
时间:
2014-3-21 13:14
个人认为只要查找1~1000中有多少个5的倍数就能迅速找到有几个零
个位5------------->100个
个位0,十位不为0------------->90个
整百------------------------->9个
整千--------------------->1个
这里面最难得是算5
大致思路是这样
作者:
山治0712
时间:
2014-3-21 13:22
硬算是算不了的,需要技巧。* 最后的结论是:可以转换成求1到1000中能被5整除并且因子是5的个数。
*
* 首先知道这,就可以只测试5的整数倍的数。
* 如果是5的倍数,就循环除以5再测试,只到不是5的整数倍为止,而每一次的测试就表示会有一个0的出现,count就自加1.
*/
public static void main(String[] args) {
int count=0;//计数器
for(int x = 1; x <= 1000; x++){
//只测试5的整数倍的数
if((x%5)==0){
count = test(x,count);
}
}
System.out.println(count);//结果显示249
}
public static int test(int num,int count){
//如果num是5的整数倍
//while( (num%5)==0 && (num/5) >=1 ){
while( (num%5)==0){
count++;
num/=5;
//625 625 125 25 5 1
//125 5x5x5
//30 5x6
//75 5x5x5
//15 3x5
//130 5x26
}
return count;
}
作者:
董振冬
时间:
2014-3-21 16:05
package cn.itcast.bank;
public class test {
public static void main(String[] args){
//跟基础测试题里面含7 。3的那道题没多大区别啊
//首先遍历获取全部的数字
int count = 0;
for(int i=1 ; i <= 1000; i++){
String s = String.valueOf(i);
//把数字转成字符,判读出所有含有0的字符
if(s.contains("0")){
char c = '0';
//把字符转换成char数组
char[] chars = s.toCharArray();
for(int j = 0; j < chars.length; j++)
{
//判断数组中每个字符是否为0
if(c == chars[j])
{
count++;
}
}
}else{
System.out.println("没有0,我是"+ Integer.parseInt( s ));
}
}
System.out.println(count);
}
}
复制代码
代码加注释,,介个不需要解释了吧。。。呵呵!
作者:
董振冬
时间:
2014-3-21 16:06
董振冬 发表于 2014-3-21 16:05
代码加注释,,介个不需要解释了吧。。。呵呵!
简单高效!
作者:
青木郎
时间:
2014-3-21 16:22
本帖最后由 青木郎 于 2014-3-21 16:24 编辑
一共有237个0
具体思路:
在1~1000的数字中;一眼能看到带0的数字有整千,整百,整十,以及和5相乘的数
序列一:个位5- 100个)(15,25……)
序列二:个位0,十位不为0------------->90个--->90个0
序列三:整百------------------------->9个------>18个0
序列四:整千--------------------->1个----------->3个0
序列五:1~1000,除了整十整百整千,剩下的偶数;
所以现在能直观的看到111个0
在序列一中找我们有用的是5,所以全部分解,最后得到125个5
在序列二中找我们有用的,全部分解我们得到83个2
在序列三中,同理我们得到1个5,7个2
序列四没有有用的
序列五,得到了至少超过50个2
最后我们得到126个5,大于126个2,这样我们又得到126个0
最后一共237个0
作者:
tcny
时间:
2014-3-21 22:00
public class Test5 {
//计算能够被n整除的个数
static int getDiv(int n){
int temp = 0;
for(int i = 1; i <= 1000; i++){
if(i%n == 0){
temp++;
}
}
return temp;
}
public static void main(String[] args) {
int n = 5;
int num = 0;
//遍历5,25,125,625……不超过1000
for(int i = n; i <= 1000; i*=5){
num += getDiv(i);
}
System.out.println("!1000的末尾有"+num+"个零.");
}
}
复制代码
作者:
my_android_drea
时间:
2014-3-21 23:54
本帖最后由 my_android_drea 于 2014-3-21 23:58 编辑
其实只需要找总共有多少个5相乘即可。把所有5的倍数拆开,计算该倍数有几个5相乘,同理,求2的个数,(为什么要求5和2的个数呢?因为5x2=10 啊!!!)但是2的个数明显比5多,所以,计算5即可!例如:15=3x5 (一个5); 25=5x5 (两个5),如此类推!
上面有几个程序都是这个原理!!
public class Test{
// 计算5的倍数中有几个5相乘!返回个数!
static int getNumbleOf(int n){
int num=0;
while((n%5)==0){
n=n/5;
num++;
}
return num;
}
public static void main(String[] args) {
int num = 0;
for(int i = 1; i <=1000; i++){
if((i%5)==0){ //筛选5的倍数
num += getNumbleOf(i);
}
}
System.out.println("!1000的末尾有"+num+"个零.");
}
}
复制代码
作者:
邵景伦
时间:
2014-3-22 15:06
谢谢支持
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2