数组定义: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(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()函数的内部实现会耗时
475

被折叠的 条评论
为什么被折叠?



