练习Day——10

水下探测器

题目描述
水下探测器可以潜入湖中在任意水深进行科学探索。
湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<=100;
探测器最初的水下深度为 s 米,0<=s<=100;
当探测器不在水面(当前深度大于 0)时,每个 u 指令可使它上浮 1 米,而当探测器在水面时,u 指令是无效的;
当探测器不在湖底(当前深度小于 h)时,每个 d 指令可使它下沉 1 米,而当探测器在湖底时,d 指令是无效的;
在执行到无效指令时,探测器不做任何操作而继续执行下一指令。

编程实现
根据给定的 h、s 和一个指令序列(由字符 u、d 组成的字符串,长度不超过 100),求出执行完整的指令序列后,探测器的水下深度。

输入
第一行:h 和 s,以空格分开。0<=s<=h<=100
第二行:长度不超过 100 的指令字符串,串中仅包含字母 u 或 d

输出
代表探测器在执行指令后的水下深度的数字。

样例输入
9 1
uduudd

样例输出
2

import java.util.Scanner;

public class Main {
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		int h=scan.nextInt();//在湖底时到水面的距离
		int s=scan.nextInt();//最初水下深度
		String str=scan.next();//指令
		scan.close();
		
		for(int i=0;i<str.length();i++) {
			char ch=str.charAt(i);
			if(ch=='u') {//上浮
				if(s>0)
					s-=1;
			}
			else if(ch=='d') {//下沉
				if(s<h)
				    s+=1;
			}
		}
		
		System.out.println(s);
	}

}

阶乘计算(高精度)

题目描述
输入一个正整数n,输出n!的值。其中n!=123*…*n。

算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入
输入包含一个正整数n,n< =1000。

输出
输出n!的准确值。

样例输入
10

样例输出
3628800

import java.util.Scanner;

//阶乘计算

public class Main{
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int m=n;
		int A[]=new int[10000];
		
		A[0]=1;
		
		int len=0;//记录结果的长度
		for(int i=2;i<=n;i++) {
			int jinwei=0;//向高位的进位
			for(int j=0;j<1000;j++) {
				int tmp=A[j]*i+jinwei;//当前位的值等于相乘过后的值加上进位
				
				A[j]=tmp%10;
				jinwei=tmp/10;
			}
		}
		boolean pri=false;
        for(int i=9999;i>=0;i--){
            if(pri){
                System.out.print(A[i]);
                continue;
            }

            if(A[i-1] != 0){
                pri=true;
            }
        }

	}

}

高精度加法

题目描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。

输入
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出
输出一行,表示a + b的值。

样例输入
20100122201001221234567890
2010012220100122

样例输出
20100122203011233454668012

import java.util.Scanner;
//高精度加法

public class Main {
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		int A[]=new int[100];//两个整数都不超过100位
		int B[]=new int[100];
		int C[]=new int[101];//他们的和不超过101位
		//输入两个非负整数
		String a=scan.nextLine();
		String b=scan.nextLine();
		
		//将字符串的对应位存储在数组中
		for(int i=a.length()-1,j=0;i>=0;i--,j++) {
			A[j]=Integer.parseInt(a.substring(i, i+1));
		}
		
		for(int i=b.length()-1,j=0;i>=0;i--,j++) {
			B[j]=Integer.parseInt(b.substring(i,i+1));
		}
		
		
		int jinwei=0;//低位向高位的进位
		
		for(int i=0;i<100;i++) {
			int tmp=A[i]+B[i]+jinwei;
			C[i]=tmp%10;
			jinwei=tmp/10;
		}
		
		boolean pri=false;
        for(int i=100;i>=0;i--){
            if(pri){
                System.out.print(C[i]);
                continue;
            }

            if(C[i-1] != 0){
                pri=true;
            }
        }
	}
}

高精度减法

问题描述
高精度减法

输入
两行,表示两个非负整数a、b,且有a > b。
  
输出
一行,表示a与b的差。

样例输入
1234567890987654321

9999

样例输出
1234567890987644322

一、

import java.util.Scanner;

//高精度减法
public class Main {
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		String a=scan.next();
		String b=scan.next();
		scan.close();
		
		int A[]=new int[1000];
		int B[]=new int[1000];
		int C[]=new int[1000];
		
		for(int i=a.length()-1,j=0;i>=0;i--,j++) {
			A[j]=Integer.parseInt(a.substring(i, i+1));
		}
		for(int i=b.length()-1,j=0;i>=0;i--,j++) {
			B[j]=Integer.parseInt(b.substring(i, i+1));
		}
		
		int jiewei=0;
		for(int i=0;i<1000;i++) {
			int tmp=A[i]-B[i]-jiewei;
			if(tmp>=0) {
				C[i]=tmp;
				jiewei=0;
			}
			else {
				C[i]=tmp+10;
				jiewei=1;
			}
		}
		
		boolean pri=false;
		for(int i=1000;i>=0;i--) {
			if(pri) {
				System.out.print(C[i]);
				continue;
			}
			if(C[i-1]!=0)
				pri=true;
		}
	}

}

二、

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		BigInteger a=scan.nextBigInteger();
		BigInteger b=scan.nextBigInteger();
		scan.close();
		
		System.out.print(a.subtract(b));
	}

}

高精度乘法

问题描述
计算机真是最傻的东西;他都不能计算大于10^65-1的a*b,请你帮这个“最傻”的东西过关,否则它就真的只认识1和0了。

输入
共两行;
第一行输入一个整数a;
第一行输入一个整数b。

输出
共一行,一个表示a*b的整数。

样例输入
2147483647
2147483647

样例输出
4611686014132420609

数据规模和约定
10^65-1< a , b <10^201-1

import java.math.BigInteger;
import java.util.Scanner;

//高精度乘法
public class Main {
	public static int MAXN=(int) Math.pow(10, 201);
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		BigInteger a=scan.nextBigInteger();
		BigInteger b=scan.nextBigInteger();
		
		scan.close();
		System.out.println(a.multiply(b));
	}

}

高精度除高精度

问题描述
给定a, b,求a/b。

输入
输入两行,分别包含一个整数。

输出
输出一行,为a/b的商。
  
样例输入
62349
64

样例输出
974

数据规模和约定
1<=a<=10^10000 , 1<=b<=10^10000。

import java.math.BigInteger;
import java.util.Scanner;

//高精度除高精度
public class Main {
	public static void main(String[]args) {
		Scanner scan=new Scanner(System.in);
		BigInteger a=scan.nextBigInteger();
		BigInteger b=scan.nextBigInteger();
		scan.close();
		System.out.println(a.divide(b));
	}

}

BigInteger常用算术运算符

BigInteger a = new BigInteger("12345678910111213");
BigInteger b = new BigInteger("1234505961232692");

BigInteger add = a.add(b);// 加法

BigInteger subtract = a.subtract(b); // 减法

BigInteger multiply = a.multiply(b); // 乘法

BigInteger divide = a.divide(b); // 除法

BigInteger mod = a.mod(b); // 取余(只返回正数)

BigInteger remainder = a.remainder(b); // 取余(正负数都有可能返回)

// 求商和余数
BigInteger[] bigIntegers = a.divideAndRemainder(b); // 返回一个BigInteger数组,bigIntegers[0]是a/b的商,bigIntegersp[1]是a%b的余数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值