第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

na Ramanujan 數(shù)是什么——為什么我在接近 2^63 的值中出現(xiàn)錯誤?

na Ramanujan 數(shù)是什么——為什么我在接近 2^63 的值中出現(xiàn)錯誤?

MM們 2023-06-08 17:28:09
給定一個數(shù)字,測試它是否是 Ramanujan 數(shù)(在我們的課程中定義為兩種不同方式的兩個立方體的總和)。它必須在 n^(1/3) 時間內(nèi)運行。我的代碼正在運行——有時。隨著測試值接近 2^63 -1,我收到了一些隨機錯誤。奇怪的是,在我更改計數(shù)器的起始值以修復不同的錯誤之前,我通過了該范圍內(nèi)數(shù)字的測試。誰能告訴我為什么會這樣?我設置了一個 for 循環(huán)來為 a^3 創(chuàng)建值。然后我設置 b=(na^3)^(1/3) 的值。然后我測試 b 看它是否是一個整數(shù)。如果是這樣,請打破循環(huán)。在此處插入一個 if 測試以使代碼正常工作,但我不知道為什么需要這樣做,這就是這個問題的要點。此 if 語句為高于和低于 n=2^63 的值設置了兩個不同的 for 循環(huán)n < 2^63 的第二個循環(huán)從 c=a+1 開始,所以我不重復。這和第一個一樣。n > 2^63 的第二個循環(huán)從 c=a 開始。為什么這會有所作為?為什么相同的代碼不適用于更小和更大的數(shù)字?對不起,我的代碼太幼稚了,我才剛剛起步,很多功能在我的課程中都是禁止使用的。(例如,我不能使用 floor() 并且也不允許為它編寫自己的函數(shù))。public class Ramanujan {public static boolean isRamanujan(long n) {    if (n <= 0) return false;    long a3 = 0;    long c3 = 0;    double b = 0;    double d = 0;    for (int a = 1; a < n; a++) {        a3 = (long) a * a * a;        if (a3 > n) break;        b = Math.cbrt(n - a3);        if (b == (int) b) break;    }    if (n > Math.pow(2, 62)) {        for (int c = (int) Math.cbrt(a3); c < n; c++) {            c3 = (long) c * c * c;            if (c3 > n) break;            d = Math.cbrt(n - c3);            if (d == (int) d) break;        }    }    else {        for (int c = (int) Math.cbrt(a3) + 1; c < n; c++) {            c3 = (long) c * c * c;            if (c3 > n) break;            d = Math.cbrt(n - c3);            if (d == (int) d) break;        }    }    if (a3 + (long) b * b * b == c3 + (long) d * d * d && b * b * b != c3) return true;    return false;}public static void main(String[] args) {    long n = Long.parseLong(args[0]);    StdOut.println(isRamanujan(n));}}關于為什么我需要區(qū)分較大和較小數(shù)字的任何見解?
查看完整描述

4 回答

?
茅侃侃

TA貢獻1842條經(jīng)驗 獲得超21個贊

n當超過 a 可以容納的值時,您會得到奇怪的結果long,即Math.pow(2, 63) == Long.MAX_VALUE。到那時,n就會出現(xiàn)數(shù)值溢出。


final long l = Long.MAX_VALUE; // == 2^63

System.out.println(l); // 9223372036854775807

System.out.println(l + 1); // -9223372036854775808


查看完整回答
反對 回復 2023-06-08
?
HUH函數(shù)

TA貢獻1836條經(jīng)驗 獲得超4個贊

當甚至超過 type 的范圍時,由于算術溢出,您會得到大值的隨機錯誤。您應該為所有整數(shù)變量使用 type以減少這種可能性,并確保中間結果不超過 type 的范圍。intMath.cbrt(a3)Math.cbrt(n - a3)intlonglong


這是一個使用單個循環(huán)的更簡單的實現(xiàn),計算方式的數(shù)量:


public class Ramanujan {

    public static boolean isRamanujan(long n) {

        if (n <= 0) return false;

        int count = 0;

        for (long a = 1;; a++) {

            long a3 = a * a * a;

            if (a3 > n - a3) break;

            long b = (long)Math.cbrt(n - a3);

            if (a3 + b * b * b == n) count++;

        }

        return count >= 2;

    }

    public static void main(String[] args) {

        if (args.length == 1) {

            long n = Long.parseLong(args[0]);

            StdOut.println(isRamanujan(n));

        } else

        if (args.length == 2) {

            long n1 = Long.parseLong(args[0]);

            long n2 = Long.parseLong(args[1]);

            for (long n = n1; n <= n2; n++) {

                if (isRamanujan(n))

                    StdOut.println(n);

                if (n == Long.MAX_VALUE) // handle n2 == Long.MAX_VALUE

                    break;

            }

        } else {

            StdOut.println("usage: Ramanujan n1 [n2]");

        }

    }

}


查看完整回答
反對 回復 2023-06-08
?
慕尼黑8549860

TA貢獻1818條經(jīng)驗 獲得超11個贊

問題在于乘以a and c類型變量int來計算立方體。需要將cast每個變量long乘以。

例子, a3 = (long) a * (long) a * (long) a;


查看完整回答
反對 回復 2023-06-08
?
哈士奇WWW

TA貢獻1799條經(jīng)驗 獲得超6個贊

long 可以容納的最大數(shù)字(在 Java 中)是 (2 ^ 63) - 1 (Long.MAX_VALUE)。你為什么要計算 Math.cbrt(a3) ?如果 a3 = a * a * a,那么您已經(jīng)知道 Math.cbrt(a3) 是什么。

如果 n > 9223372036854774272 Math.cbrt of 9223372036854774273 是 2097152 并且如果你立方體你因為溢出而得到負數(shù),那么你的代碼有問題。


查看完整回答
反對 回復 2023-06-08
  • 4 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號