zoukankan      html  css  js  c++  java
  • Coefficient Computation (大整数、Java解决)

    Coefficient Computation UVALive8265

    题意:计算组合数C(n,k)的值并将值按给定的进制输出。

    思路:Java大整数类硬上。

    PS:刚刚学完Java的大整数类,结果却被Java怎么开数组卡到吐血,直接后果就是少开一题,赛后学长指导后5分钟出题,真酸爽……

    1. 包:java.math.*
    2. BigInteger类实现了任意精度的整数运算。
    3. BigDecimal类实现了任意精度的浮点数运算。
    4. 读入大整数a:Scanner in = new Scanner(System.in); BigInteger a; a = in.nextBigInteger();

    定义大整数类BigInteger a,b;

    • 静态valueOf方法可以将普通的数值转换为大数值:BigInteger a = BigInteger.valueOf(100)
    • 大整数的相加a = a.add(b);表达式为a =a+ b;
    • 大整数的相减a = a.subtract(b);表达式为 a = a - b;
    • 大整数的相乘a = a.multiply(b);表达式为  a = a * b;
    • 大整数的相除a = a.divide(b);表达式为 a = a / b;
    • 大整数的取余a = a.mod(b);表达式为 a = a % b;
    • 大整数的比较a.compareTo(b);如果a与b相等则返回0,如果a大于b返回正数,如果a小于b返回 负数;
    • a.valueOf(100);返回值为100的大整数;
    • 将字符串转换成10进制大整数类型:String s = "100000000000000000000000000000000" ,BigInteger c = new BigInteger(s,10)
    • 其他操作:a.pow(b) = a^b;a.gcd(b) = a和b的最大公约数;a.abs() = a的绝对值;a.negate() = a的取反数;max(),min();
    • System.out.println(a.toString(d));将大整数a按d进制输出;

    大实数类的运算(实现方法与大整数一样):

    • BigDecimal add(BigDecimal other)相加
    • BigDecimal subtract(BigDecimal other)相减
    • BigDecimal multiply(BigDecimal other)相乘
    • BigDecimal divide(BigDecimal other RoundingMode mode) 5.0  相除,必须给出舍入方式RoundingMode.HALF_UP是在学校学习的四舍五入方式
    • BigDecimal compareTo(BigDecimal other)比较返回值和大整数一样,见上边
    • static BigDecimal valueOf( long x) 返回值为x的大实数
    • static BigDecimal valueOf(long x,int scale)返回值为x / 10的scale次方的大实数

    好了上代码:

    import java.math.*;
    import java.util.*;
    
    public class Main
    {
        public static void main(String[] args)
        {
            Scanner in = new Scanner(System.in);
            int n,k,d,t;
            t = in.nextInt();
            for(int o = 0; o < t; o++)
            {
                n = in.nextInt(); 
                k = in.nextInt();
                d = in.nextInt();
                if(n == 0 || k == 0)
                    System.out.println(1);
                else
                {
                    BigInteger big = BigInteger.valueOf(n);
                    for(int i = n-1; i >= n-k+1; i--)
                    {
                        big = big.multiply(BigInteger.valueOf(i));
                    }
                    BigInteger lit = BigInteger.valueOf(k);
                    for(int i = k-1; i > 0; i--)
                    {
                        lit = lit.multiply(BigInteger.valueOf(i));
                    }
                    BigInteger ans = big.divide(lit);
                    BigInteger[] temp = new BigInteger[50010];//!!!!!!!!!!!!!!!!!!!!!!!!!开数组
                    BigInteger dd = BigInteger.valueOf(d);
                    int index = 0;
                    while(true)
                    {
                        if(ans.compareTo(BigInteger.valueOf(0)) == 0) break;
                        temp[index++] = ans.mod(dd);
                        ans = ans.divide(dd);
                    }
                    for(int i = index-1; i>=0; i--)
                        System.out.print(temp[i]);
                    System.out.println();
                }
            }
        }
    }
    View Code

    大整数类也是一个封装好的类,所以可以开数组,但要注意开数组的格式。

  • 相关阅读:
    Blend3中创建的Silverlight程序在设计模式下无法显示图片的解决办法
    创建Silverlight Bussiness Application时报错的解决
    .NET 2.0 字符串比较
    ASP.NET 客户端缓存
    AjaxPro部署成功
    遭遇反序列化异常:"在分析完成之前就遇到流结尾"
    正则表达式
    哈哈,终于申请获得批准了!
    ClientScript.RegisterClientScriptInclude注册脚本
    今天经过一场深有体会的谈话终于决定了我2012的方向
  • 原文地址:https://www.cnblogs.com/sykline/p/9737766.html
Copyright © 2011-2022 走看看