随笔分类 - 大数
使用数组进行的超出基本类型长度的数值操作.
摘要:友情提示:使用该模板的注意了,在大数减法里有一个小错误,导致减法可能会出错// 原来的写法,将t1.len错写成了len while(t1.a[len - 1] == 0 && t1.len > 1){ t1.len--; big--;}// 改正后while(t1.a[t1.len - 1] == 0 && t1.len > 1){ t1.len--; big--;} #include #include #include #include #include using namespace std; #define MAXN 9999#define
阅读全文
摘要:HDU-1402A * B Problem Plus题意:给定两个整数,整数的长度最多能达到50000位,输出两个整数的乘积。分析:题意非常的明了,一个惊世骇俗的想法是使用两个数组将整数保留起来,然后模拟我们平常手算时的乘法,不过这样一来时间复杂度将是O(N^2),由于N过大,因此此题因寻求更加快速的解法。 对于任何一个N位的整数都可以看作是An*10^(n-1) + An-1*10^(n-2) + ... + A2*10^2 + A1*10 + A0。如果把10看作是一个自变量,那么任何一个整数就可以视作为一个多项式,两个整数相乘也便可以看作是两个多项式相乘。对于一个多项式,我们平时所接触.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1212 不料JAVA又出问题了,Scanner 类竟然识别不出来,我不知道哪里出了问题,这题是求一个大数对一个相对较小的数的取余运算。刚开始的想法很傻很天真啊,直接计算出被除数的位数,再取相应的位数取余。这可是不知道错哪去了,这是对 10^K 次方的数的取余操作,放在这里显然是不合适的,如果硬要这么做的话,那么前提就是这个数必须是以MOD为进制的数。该题是这样处理的,首先判断是否满了6位,如果大于6位数字,那么就可以利用较高一位的单位量取余值等于低一位的取余值乘以十再取余。 代码如下:#include...
阅读全文
摘要:首先把100位长的斐波那契数全部计算出来,然后遍历计数,很暴力啊! 代码如下:import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigInteger[] a = new BigInteger[1000]; a[1] = BigInteger.ONE; a[2] = BigInteger.ONE.add( BigInteger.ONE ); a[.
阅读全文
摘要:开辟一个数组通过 %2来计算斐波那契数。 代码如下:import java.math.BigDecimal;import java.math.BigInteger;import java.util.Locale;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigInteger[] a = new BigInteger[2]; int num, ca; ca = in.nextInt(); wh.
阅读全文
摘要:输出之前先去掉前导的零,再转化为普通字符型,可能会以科学计数法输出。 代码如下:import java.math.BigDecimal;import java.util.Locale;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigDecimal a, b; while( in.hasNextBigDecimal() ) { a = in.nextBigDecimal(); b = in.n.
阅读全文
摘要:这次是被彻底的无语了,由于对java语言的不熟悉,很对简单的操作都是无计可施,还好上网查了一下一些函数的API,熟悉了相关的操作。只能惊叹java自带的类还是很强大的。代码如下: import java.math.BigDecimal;import java.util.Locale;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigDecimal a, res; int exp; while .
阅读全文
摘要:在做这个题的过程中有了解到了在java这么语言中,只有八种常量是直接分配内存的,其余对象均为引用类型,这样有效的避免了内存的浪费。不过还有一个问题,为什么这样写就不正确呢? if( b == BigInteger.ZREO ) {} 这个判定输入的b是否为零就不正确。 代码如下:import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { BigInteger sum, b; int T; Scanner in = new Sc.
阅读全文
摘要:一道最基本的大数相加题,java果然强大啊。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { BigInteger a, b; int T; Scanner in = new Scanner(System.in); T = in.nextInt(); for (int i = 1; i <= T; ++i) { System.out.println("Case" + " "
阅读全文
摘要:先就题目意思做简单介绍,题中要求在给定的两个数a,b(a,b<=10^100)之间[a,b]计算有多少个斐波那契(Fibonacci)数,注意这里约定:f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n >= 3) 基本思路如下: 1.鉴于有多组测试数据且斐波那契数又是一组特殊的数组(每一项与前驱有一定的关系),采用打表的方式,将1-10^100之间所有的斐波那契数储存起来. 2.录入两个字符串作为上下界. 3.在斐波那契数组中检索上下界的位置,直接求出中间存在斐波那契数的个数.代码如下:#include<stdio.h>#include<s
阅读全文
摘要:这是一道简单的数学题,求一个数(N)的阶乘。但是问题是题中N给的非常大(0<=N<=10000),用for循环来做显然不行了。这里用数组来对付这些大家伙。基本思路如下: 1.开辟一个够大的数组,保证大于1000!所占的位数,我是以最大情况来估算,即1000个1000相乘,开一百万吧,反正我们老大(Miyu)说了数组空间烂便宜。 2.然后就是挨个来乘了(说白了,就是模拟我们平时的乘法),这里不要惯性的只要看见某位过10便想着进位,虽然这样能做,但艰难。可以让一位存大一点的数值,要知道,对于每一位来说,可以存下一个21亿的数字。 3.如果只是乘,不中途处理一次进位的话,那便永远是在“个
阅读全文