蓝桥杯-第七届蓝桥杯决赛第一题

蓝桥杯-第七届蓝桥杯决赛第一题


阶乘位数


9的阶乘等于:362880
它的二进制表示为:1011000100110000000
这个数字共有19位。

请你计算,9999 的阶乘的二进制表示一共有多少位?

注意:需要提交的是一个整数,不要填写任何无关内容(比如说明解释等)


答案为:118445



分析:

对于本题如果使用int类型来计算9阶乘可以计算出结果但是计算999!返回结果为0,因为超出了int类型的范围,
使用long型也不可以,所以对于这么长的数据只好使用大数来进行计算,接下来了解一下BigInteger类中常用的方法

这个类的取值范围是没有上限的,取决于你计算机的内存


知识点:

总结来其中最常用的构造方法是BigInteger(String val)直接将字符串转化为整型
常用的方法有四则运算
BigInteger abs()  返回大整数的绝对值
BigInteger add(BigInteger val) 返回两个大整数的和
BigInteger divide(BigInteger val)  返回两个大整数的商
BigInteger multiply(BigInteger val) 返回两个大整数的积
BigInteger subtract(BigInteger val)返回两个大整数相减的结果

BigInteger and(BigInteger val)  返回两个大整数的按位与的结果
BigInteger andNot(BigInteger val) 返回两个大整数与非的结果
BigInteger not() 返回当前大整数的非
BigInteger or(BigInteger val) 返回两个大整数的按位或
BigInteger xor(BigInteger val) 返回两个大整数的异或

double doubleValue()   返回大整数的double类型的值
float floatValue()   返回大整数的float类型的值

int intValue() 返回大整数的整型值
long longValue() 返回大整数的long型值

BigInteger max(BigInteger val) 返回两个大整数的最大者
BigInteger min(BigInteger val) 返回两个大整数的最小者
BigInteger mod(BigInteger val) 用当前大整数对val求模
BigInteger negate() 返回当前大整数的相反数
BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数
BigInteger gcd(BigInteger val)  返回大整数的最大公约数

BigInteger pow(int exponent) 返回当前大整数的exponent次方

BigInteger leftShift(int n) 将当前大整数左移n位后返回
BigInteger rightShift(int n) 将当前大整数右移n位后返回

byte[] toByteArray(BigInteger val)将大整数转换成二进制反码保存在byte数组中
String toString() 将当前大整数转换成十进制的字符串形式

BigInteger valueOf(long val)返回一个BigInteger,其值等于指定的long值。

代码片段:

package SevenProvience.tital1;

import java.math.BigInteger;

public class Test1 {

	public static void main(String[] args) {
		//创建阶乘开始数
		BigInteger beg=new BigInteger("1");
		//创建阶乘结束数
		BigInteger end=new BigInteger("9999");
		//创建 求和数
		BigInteger sum=new BigInteger("1");
		//计数0
		int countFor0=0;
		//计数1
		int countFor1=0;
						
		//字符串形式的二进制大数
		String binS="";
		//通过for循环求阶乘
		//for循环中的i还是使用整型比较好一点
		for(int i=beg.intValue();i<=end.intValue();i++){
			//调用valueOf()方法把整数类型数据转化为大数类型
			sum=sum.multiply(BigInteger.valueOf(i));
		}
		
		System.out.println("十进制结果为:"+sum);
		//把结果大数转化为字符串类型
		String s=sum.toString();
		//打印出s的值
		System.out.println("十进制结果的长度:"+s.length());
		//把大数转化为二进制数	
		//当sum<1时循环
		while(sum.compareTo(new BigInteger("1"))>0){
			BigInteger j=sum.remainder(new BigInteger("2"));
			sum=sum.divide(new BigInteger("2"));
			binS=j+binS;
			//System.out.println(binS);
		}
		binS=sum+binS;
		System.out.println("二进制结果为:"+binS);
		//输出二进制的长度
		System.out.println("二进制长度为:"+binS.length());
		//将String类型转化为char类型
		char[] binChar=binS.toCharArray();
		
		
		//附加统计出二进制数中的0和1分别是多少
		//统计个数
		for(int x=0;x<binChar.length;x++){
			if(binChar[x]=='0'){
				countFor0++;
			}else{
				countFor1++;
			}
		}
		System.out.println("0的个数:"+countFor0);
		System.out.println("1的个数:"+countFor1);
		int total=countFor0+countFor1;
		System.out.println("总个数:"+total);
		
	}

}

方法二:

首先想到十进制转二进制的整除2倒取余,然后就很容易推断处下边的结论


    public class Main {  
        public static void main(String[] args) {  
            int m = 9999;  
            double temp,r=0;  
            for (int i = m; i > 1; i--) {  
                temp = Math.log(i) / Math.log(2);  
                r += temp;  
            }  
            System.out.println((int)r+1);  
        }  
    }  





 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值