JAVA写大数总结

数组定义:int a[]=new int[N];

数组清零:java.util.Arrays.fill(a,0);数组赋值可以赋任意值,正负数,true,false;

1.valueOf(parament); 将参数转换为制定的类型
比如 int a=3;
BigInteger b=BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;

2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);

BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix); //这个没用过
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

compareTo:根据该数值是小于、等于、或大于 val 返回 -1、0 1;
equals:判断两数是否相等,也可以用compareTo来代替;相等返回true,否则false。
min,max:取两个数的较小、大者,调用方法:java.lang.Math.max(a,b),参数类型:int,double,long,好像不能是BigInteger;

shiftLeft:左移,this << n ,this*2^n;
shiftRight:右移,this >> n,this/2^n;
and:等同于c++的&&,且;
or:||,或;
xor:异或,BigInteger xor(BigInteger val),this^val
not:!,非;

math函数中的常用函数:

Math.sin(0)     //返回0.0,这是double类型的值  
Math.cos(0)     //返回1.0   
Math.tan(0.5)       //返回0.5463024898437905   
Math.round(6.6)     //返回7   
Math.round(6.3)     //返回6   
Math.ceil(9.2)      //返回10 .0  
Math.ceil(-9.8)     //返回-9 .0  
Math.floor(9.2)     //返回9 .0  
Math.floor(-9.8)        //返回-10 .0  
Math.sqrt(144)      //返回12.0   
Math.pow(5,2)       //返回25.0   
Math.exp(2)     //返回7.38905609893065   
Math.log(7.38905609893065)  //返回2.0   
Math.max(560, 289)  //返回560   
Math.min(560, 289)      //返回289   
Math.random()       //返回0.0到1.0之间双精度的一个随机数值 
System.out.println(Math.sin(Math.PI/4)); 
大数常用函数应用

import java.io.*;
import java.math.*;
import java.util.*;
import java.math.*;
public class Main {
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		BigInteger s[]=new BigInteger[5];
		while(cin.hasNext())
		{
			BigInteger a=cin.nextBigInteger();
			BigInteger b=cin.nextBigInteger();
			int c=cin.nextInt();
			Double d=cin.nextDouble();
			System.out.println(a.add(b));//加
			System.out.println(a.subtract(b));//减
			System.out.println(a.multiply(b));//乘
			System.out.println(a.divide(b));//除
			System.out.println(a.mod(b));//取余
			System.out.println(a.remainder(b));//取余
			System.out.println(a.gcd(b));//最大公因数
			System.out.println(Math.abs(c));//参数类型不能是BigInteger,int,double都可以
			System.out.println(a.negate());//取负数
			System.out.println(a.pow(c));//pow函数参数只能是int
			
			s=a.divideAndRemainder(b);//先用a除以b得到s[0],再用a取余b得到s[1]
			System.out.println(s[0]);
			System.out.println(s[1]);
		}
	}
}
大数常见题型:

大数阶乘

import java.math.BigInteger;
import java.util.Scanner;
import java.io.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext())
		{
			int a=cin.nextInt();
			BigInteger ans=BigInteger.ONE;
			for(int i=2;i<=a;i++)
				ans=ans.multiply(BigInteger.valueOf(i));
			System.out.println(ans);
		}
	}
}
大数加法

//整型
import java.util.Scanner;
import java.math.BigInteger;
import java.io.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin= new Scanner(System.in);
		int n=cin.nextInt(),num=0;
		while(n>0)
		{
			n--;
			num++;
			BigInteger a=cin.nextBigInteger();
			BigInteger b=cin.nextBigInteger();
			System.out.println("Case "+num+":");
			System.out.println(a+" + "+b+" = "+a.add(b));
			if(n>0) System.out.println("");
		}
	}
}

//double型
import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin=new Scanner(System.in);
        BigDecimal a,b;
        String ans;
        while(cin.hasNext())
        {
            a=cin.nextBigDecimal();
            b=cin.nextBigDecimal();
            ans=a.add(b).stripTrailingZeros().toPlainString();//去掉后面多余的零
            System.out.println(ans);
        }
    }
}

//或者这样
import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin=new Scanner(System.in);
        BigDecimal a,b,c;
        while(cin.hasNext())
        {
            a=cin.nextBigDecimal();
            b=cin.nextBigDecimal();
            c=a.add(b).stripTrailingZeros();
            System.out.println(c);
        }
    }
}
大数次方

import java.io.*;
import java.util.Scanner;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		BigDecimal a;
		int b;
		String c;
		while(cin.hasNext())
		{
			a=cin.nextBigDecimal();
			b=cin.nextInt();
                        //前一个函数实现整数去小数点,小数去后尾的0,后面的函数将结果转化为字符串的形式以便去结果的前导零
                       c=a.pow(b).stripTrailingZeros().toPlainString();
			if(c.startsWith("0")) c=c.substring(1);//去前导0
                        //if(c.charAt(0)=='0') c=c.substring(1);//一样的功能,去前导零
                       System.out.println (c);
		}
	}
}

递推:a[i]=3*a[i-1]-a[i-2]

import java.util.*;
import java.math.*;
import java.io.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		BigInteger a[]=new BigInteger[110];
		a[1]=BigInteger.valueOf(1);
		a[2]=BigInteger.valueOf(3);
		for(int i=3;i<=100;i++)
		{
			a[i]=BigInteger.valueOf(3).multiply(a[i-1]).subtract(a[i-2]);
		}
		while(cin.hasNext())
		{
			int n=cin.nextInt();
			System.out.println(a[n]);
		}
	}
}
斐波那契:a[i]=a[i-1]+a[i-2]

import java.util.*;
import java.io.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner (System.in);
		BigInteger ans[]=new BigInteger[1010];
		ans[1]=ans[2]=BigInteger.ONE;
		for(int i=3;i<=1000;i++)
			ans[i]=ans[i-1].add(ans[i-2]);
		int n=cin.nextInt(),a;
		while(n!=0)
		{
			n--;
			a=cin.nextInt();
			System.out.println(ans[a]);
		}
	}
}
链接: 点击打开链接

求n!的结果有多少位数

但是这样做会超时,这里有个数学公式可以解决:阶乘的位数就等于lgN!+1,即对1~N取对数的和+1即可。

import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin=new Scanner(System.in);
		BigInteger ans;
		int n;
		String s;
		while(cin.hasNext())
		{
			n=cin.nextInt();
			ans=BigInteger.ONE;
			while(n>1)
				ans=ans.multiply(BigInteger.valueOf(n--));
			s=ans.toString();//将结果转换为字符串的形式
			System.out.println(s.length());//再调用length函数
		}
	}
}
利用公式

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;
#define inf 0x3fffffff
#define LL long long
const int N=1000010;
double a[N];
int main()
{
    a[0]=1;//一定要让a[0]=1
    for(int i=1;i<=N;i++)
        a[i]=a[i-1]+log10((double)i);
    int n;
    while(~scanf("%d",&n))
    {
        printf("%d\n",(int)a[n]);
    }
}
遍历:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;
#define inf 0x3fffffff
#define LL long long
const int N=1000010;
double a[N];
int main()
{
    int n ;
    while(scanf("%d",&n)!=EOF)
    {
        int result=1;
        int i;
        double temp = 1;
        for(i=n;i>0;i--)
        {
            temp*=i;
            while((temp/10)>1)
            {
                result++;
                temp=temp/10;
            }

        }
        printf("%d\n",result);
    }
    return 0;
}
很奇怪为什么这个遍历就不会超时,而用java遍历就会超时,我觉得可能是因为那个length()函数的内部实现会耗时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值