Javaでの多数の問題


Javaは良いかどうかはわかりませんが、Pythonなどの動的言語と比較すると致命的な問題があります。つまり、型によって引き起こされるいくつかの問題があります。Javaは半静的言語であるため、変数が宣言されると保存されます。タイプに応じてメモリ内にメモリを開きます。次に問題が発生します。私の番号が大きすぎると、オーバーフローしやすくなります。余剰分は取れるとのトピックもありますが、言わないとどうなるでしょうか。その場合、大きな数しか考慮できません。これは、考慮すべき問題が多すぎることを私たちに残します。

幸い、実際にはJavaで多数を処理するためのAPIがあります。コア実装の原則は、実際にはPython 1+1を実装するPythonインタープリターと同じです。
ここで、Pythonインタープリターに1+1を実装するのがどれほど難しいかについて少し話しましょう。まず第一に、Pythonは動的言語であり、最も明白なのは、変数型を宣言する必要がないことです。それなら、書くときはかっこいいので、インタプリタは変数の型をどのように知るのでしょうか?Pythonの最下層がC言語またはJavaであることは誰もが知っています。もちろん、使用するインタプリタ、通常はCによって異なります。インタプリタが使用されます。したがって、本質的に、Pythonコードが実行されている場合、それは実際には実行されているC言語プログラムであり、Pythonコードを推測します。

Javaはプリコンパイルできることは誰もが知っているので、アイデアのコードヒントは非常に優れていますが、Pythonはそうではなく、動的であるため、pycharmのコードヒントはアイデアほど良くないことがわかります。さて、インタプリタが最初に何をしたか見てみましょう。まず、私はコードを実行するC言語プログラムなので、当然、Pythonコードの変数型を推測する必要があります。たとえば、あなたはint型です。はい、C言語プログラムを使用してスペースを割り当てます。問題は、Pythonユーザーの場合、彼は私が入力した数値のみを気にし、変数がオーバーフローするかどうかは気にしないということです。事実高校生の時、C言語に出会うまでオーバーフローの問題について考えていませんでした。したがって、C言語インタプリタもこの型の値の長さを判断する必要があります。長すぎると、多数の方法を使用して処理する必要があります。たとえば、彼は格納する配列を申請します。これもJavaのこのAPIに含まれています。(下の写真)次に、Pythonプログラムが非常に強力であることがわかります。ですから、Pythonプログラマーは優れていますが、これら2つの商品のエンジニアリングを制御するのはより困難です。Javaは長蛇の列ですが、新人でも読めるコードを書くことはできますが、Pythonを試してみてください。そのため、数千行のPythonを書くだけでは不十分だと不満を言う人も多く、実際、このプロジェクトの量が増えているため、下位レベルの人がうまくコントロールすることは困難です。もちろん、コードの迅速性の低さも問題ですが、構文a:intが後でサポートされるため、状況は少し緩和されましたが、エンジニアリングは依然として問題です。

ここに画像の説明を挿入

OK、ゴシップはありません。何かをする時が来ました。

大きな整数の処理

BigInteger

これは組み込みの非常に古いバージョンであるため、青いブリッジカップjdk1.7を使用できないことを心配する必要はありませんが、の拡張は1.8以降のようです。これに注意する必要があります。
このBIgIntegerの使用は、実際には非常に簡単です。注意
する必要があるのは、操作にBigIntegerを使用する方法だけです。現時点では直接+-*/できないためです。

割当

2つの方法があります

BigInteger a= new BigInteger("1234567890");
BigInteger b = BigInteger.valueOf("123457890)

足し算、引き算、掛け算、割り算

a.add(b);
a.subtract(b);
a.multiply(b);
a.divide(b)

べき乗関数を見つけ、最大公約数を見つけます

a.pow(2)
a.gcd(b) a,b的最大公约数

そしてもちろんa.abs()

比較判断

eatTo()

compareTo()は、int型のデータを返します。1はより大きい、0は等しい、-1はより小さい、
max()、min():それぞれ大きい(小さい)BigIntegerデータを返します。

	//比较大小:compareTo(),max(),min()
	@Test
	public void testCompare() {
    
    
		BigInteger bigNum1 = new BigInteger("52");
		BigInteger bigNum2 = new BigInteger("27");

		//1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
		int num = bigNum1.compareTo(bigNum2);			

		//2.max():直接返回大的那个数,类型为BigInteger
		//	等价:return (compareTo(val) > 0 ? this : val);
		BigInteger compareMax = bigNum1.max(bigNum2);	

		//3.min():直接返回小的那个数,类型为BigInteger
		//	等价:return (compareTo(val) < 0 ? this : val);
		BigInteger compareMin = bigNum1.min(bigNum2);	
	}

価値


	@Test
	public void testToAnother() {
    
    
		BigInteger bigNum = new BigInteger("52");
		int radix = 2;
		
		byte[] num1 = bigNum.toByteArray();
		
		String num2 = bigNum.toString();		
		
		String num3 = bigNum.toString(radix);//转化为2进制
	
		int num4 = bigNum.intValue();

		long num5 = bigNum.longValue();

		float num6 = bigNum.floatValue();
	
		double num7 = bigNum.doubleValue();
	}

大きな浮動小数点数の処理

BigDecimal

一般的な操作方法も同様です。
いくつかの点
、つまり除算に注意し、小数を維持することに注意してください

   public static void main(String[] args)
    {
    
    
        BigDecimal a = new BigDecimal("4.5635");

        a = a.setScale(3, RoundingMode.HALF_UP);    //保留3位小数,且四舍五入
        System.out.println(a);
    }
ROUND_CEILING    //向正无穷方向舍入

ROUND_DOWN    //向零方向舍入

ROUND_FLOOR    //向负无穷方向舍入

ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式

ROUND_UP    //向远离0的方向舍入

ここに画像の説明を挿入

アイデアは非常に単純です、それは多数の問題です

package com.huterox.test03;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;

public class 复数幂
{
    
    
    public static void main(String[] args) throws FileNotFoundException
    {
    
    
        PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("复幂数.txt")));
        BigInteger a = BigInteger.valueOf(2);     
        BigInteger b = BigInteger.valueOf(3);  
        BigInteger x = BigInteger.valueOf(2);
        BigInteger y = BigInteger.valueOf(3);
        for(int i=2;i<=123456;++i)    //每次都是两组数据相乘
        {
    
    
            BigInteger t1 = a.multiply(x); 
            BigInteger t2 = a.multiply(y);  
            BigInteger t3 = b.multiply(x);    
            BigInteger t4 = b.multiply(y);   
            x = t1.subtract(t4);
            y = t2.add(t3);   
            

        }
    
        out.println(x.toString()+y.toString()+"i");
        out.close(); 
    }

}

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/123661058