水下探测器
题目描述
水下探测器可以潜入湖中在任意水深进行科学探索。
湖水的最大深度为 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的余数