蓝桥杯-阶乘运算和高精度加法(Java)

因为我感觉这两种题型都是对高精度的考察,都可以用数组代替整形进行数字运算,所以我把这两种题型放在一起了。

阶乘运算

先看一下题目

解这种题目目前我知道的有两种解题思路:

第一种解法

使用数组来表示一个大数,使用数组来进行乘法运算
这种解法关键要记住如何进行乘法运算主要是如何进位
设置一个数temptemp等于当前位上的数a[j]与乘数i的乘积再加上上一位的进位jw,这时很明显现在当前位上的数就是temp%10,而下位数的进位就是temp/10了,这个是解题的关键,在高精度加法运算中,进位也采用此种方法即可。还有就是为了确保数组能够容纳结果的长度,数组大小应设置的尽可能大,但从算法效率的角度,又不能太过于大,所以数组的大小应当适中,我们此时选择的是2000作为数组大小。

import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//收集进位的信息int jw = 0;//定义数组的大小及最大的位数int max =4000;int[] nums = new int[max];nums[0] = 1;int temp;for(int i=2;i<=n;i++){for(int j=0;j<max;j++){//常用套路temp = nums[j]*i+jw;jw = temp / 10;nums[j] = temp % 10;}}max--;while(nums[max]==0){max--;}for(int i=max;i>=0;i--){System.out.print(nums[i]);}}
}

第二种解法

Java里面有这样一种数据类型,是BigInteger
BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
而它的这种特性用在数据范围大的题目上正好合适。

import java.math.BigInteger;
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();BigInteger bigint = BigInteger.valueOf(1);for(int i=2;i<=n;i++){//BigInteger我愿称之为yydsbigint = bigint.multiply(BigInteger.valueOf(i));}System.out.println(bigint);}
}

但是需要注意的是BigInteger在赋初值时要用BigInteger.valueOf()创建BigInteger值,才能进行赋值,进行加乘运算时也要使用该数据类型自带的multiply或者add函数

高精度加法

题目如下:

解题思路与阶乘运算大致一样

第一种解法

这个大数要自己输入所以在用数组来进行高精度加法运算的过程中,先要将输入的字符串转化成字符数组在将字符数组转化为数组运算
代码如下:

import java.util.Collection;
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int temp;int jw=0;String[] add = new String[2];for(int i=0;i<add.length;i++){add[i] = sc.next();}//将字符串颠倒的方法String addone = (String) new StringBuffer(add[0]).reverse().toString();String addtwo = (String) new StringBuffer(add[1]).reverse().toString();//将字符串转化为字符数组char[] add1 = addone.toCharArray();char[] add2 = addtwo.toCharArray();//计算出那个字符数组长的那个的长度和短的那个的长度int max = Math.max(add1.length, add2.length);int min = Math.min(add1.length, add2.length);int[] sum = new int[max+1];//在长度为min之前两个数相加for(int i=0;i<min;i++){//数组进位计算的常用套路//将字符数组转化为数组运算temp = (int)(add1[i]-'0')+(int)(add2[i]-'0') + jw;jw = temp / 10;sum[i] = temp % 10;}//多出来的部分注意进位就行了,不需要相加for(int i=min;i<max;i++){if(add1.length>add2.length){temp = (int)(add1[i]-'0') + jw;}else{temp = (int)(add2[i]-'0') + jw;}jw = temp / 10;sum[i] = temp % 10;}//防止进位后比max还高一位,如果进位jw仍不为0,再进行一次进位if(jw!=0){sum[max]=jw;}while(sum[max]==0){max--;}for(int i=max;i>=0;i--){System.out.print(sum[i]);}}
}

第二种解法

直接使用BigInteger进行加法运算
这里注意一下BigInteger数据类型在输入数据是需要使用BigInteger bigint = sc.nextBigInteger();这种形式即可
代码如下:

import java.math.BigInteger;
import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);BigInteger bigint1 = sc.nextBigInteger();BigInteger bigint2 = sc.nextBigInteger();System.out.println(bigint1.add(bigint2));}
}

总结一下:两题虽然两种方法都写了一下,但是对于这两题的解法我都推荐使用第二种方法,首先第二种方法代码量少,逻辑简单,可以很好的节省时间,然后就是即然选择用Java来参加比赛,那Java里面的类和方法就尽可能的用上,可以很大程度上的节省时间。

蓝桥杯-阶乘运算和高精度加法(Java)相关推荐

  1. [Java] 蓝桥杯BASIC-29 基础练习 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  2. 蓝桥杯 ADV-121 算法提高 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  3. 蓝桥杯 BASIC-29 基础练习 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  4. [蓝桥杯]试题 基础练习 高精度加法

    #include<iostream> #include<string> #include<vector>using namespace std;int main() ...

  5. 阶乘末尾蓝桥杯java_Java实现第九届蓝桥杯阶乘位数

    阶乘位数 题目描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞&qu ...

  6. 蓝桥杯复数运算python

    蓝桥杯复数运算 资源限制 时间限制:1.0s 内存限制:256.0MB  编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间 ...

  7. 蓝桥杯第十届省赛java组解析(灵能传输 四星难度,后缀表达式 两星难度)

    第一题太简单懒得复制题目了 答案是:490 第二题: 试题 B: 不同子串 本题总分:5 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aa ...

  8. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  9. 第十二届蓝桥杯大赛软件赛省赛 Java 大学 B 组(2021年4月18日)

    第十二届蓝桥杯大赛软件赛省赛 Java 大学 B 组第一场 下载原题PDF 欢迎评论区留下答案讨论!!! 试题 A: ASC 本题总分:5 分 [问题描述] 已知大写字母 A 的 ASCII 码为 6 ...

最新文章

  1. Android开发高手课笔记--如何打造高质量应用?
  2. 构造全自动计算的CPU
  3. 抓取豆瓣上的《长津湖》的热评,我发现了这些
  4. 【经典回放】多种语言系列数据结构算法:堆排序
  5. 静态生成html的原理
  6. Swagger2 使用说明
  7. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用
  8. Sophos 修复严重的防火墙 RCE 漏洞
  9. java多线程中的调度策略
  10. Illustrator 教程,了解 Illustrator 中的效果
  11. 国外优秀的屏幕录象专家
  12. ResNet 残差神经网络(小白版)
  13. 也许你并不了解 java.lang.String | JDK 11 源码阅读分析(灌水)与优化实测
  14. Windows 取证
  15. 开发者,熊二都会的Linux入门
  16. ARFoundation系列讲解 - 80 AR内容制作一
  17. vscode 代码片段如何输出$符号
  18. 7-20 打印九九口诀表(15 分)
  19. mysql恢复drop的表_mysql恢复drop表
  20. android aidl混淆代码,Android代码混淆

热门文章

  1. 网站推广的八种基本方法(常规网站推广方法)
  2. android简易计算器(两位数的加减乘除求余)
  3. 颜色科学与计算机测配色 百度云,2004_01颜色科学与计算机测色配色实用技术_11196950.pdf...
  4. 你的软路由还只是软路由么(当软路由遇上点心云~)
  5. 详解python单例模式
  6. 【仅售9.9元】石杉老师最新出品:C2C电商系统微服务架构120天实战训练营
  7. java pkcs_用Java验证PKCS#7证书
  8. curl/wget 模拟发送post请求
  9. html表格怎么去除重复,在HTML中重复表格标题
  10. 卡尔曼滤波原理及其在RSSI测距中的应用