將一個正整數分解成連續N個正整數相乘
一個大於2的整數N,他可能等於比它小的若干個整數(大於等於2並且不等於自己)乘積。如果存在這樣的連續整數,將他們輸出,如果沒有則輸出-1。
例: 整數120,120=4*5*6或2*3*4*5。所以輸出[3,4,5],[2,3,4,5]
此處程式碼採用開方的方式計算,即如果將120拆成3*4*5,那麼將120開3次方後得到4.93242414866094,開4次方後得到3.309750919646873,即如果是連續的3個數相乘的話,那麼三個數的值則在4.93242414866094附近,如果是4個數相乘的話,則4個數的值在3.309750919646873附近,按照分佈來說左右各佔一半,故此方法通過開發後進行計算,如果該數開n次方後減去n次方的一半小於1時,則跳出開方迴圈邏輯。
/** * 通過開方的方式計算一個整數分解成連續n個整數的乘積 * @param string * @return */ static String calculate(String string) { Double srcDoubleNumber = null; try { srcDoubleNumber = Double.valueOf(string); } catch (NumberFormatException e) { e.printStackTrace(); } String str = ""; if (Objects.nonNull(srcDoubleNumber) && srcDoubleNumber > 2) { for (int i = 2; ; i++) { //開方 Double radicandLongNumber = Double.valueOf(StrictMath.pow(srcDoubleNumber, 1.0 / i)); Double radicandHalf = Double.valueOf(i) / 2; if (radicandLongNumber - radicandHalf < 1d) break; String result = calculate(srcDoubleNumber, radicandLongNumber, i, radicandHalf); if (Objects.nonNull(result)) { str = str + result +","; } } } return str.length() > 0 ? str.substring(0, str.length() - 1) : "-1"; } /** * 迴圈計算 * @param srcdoubleNumber 需要分解的數 * @param radicandLongNumber 開n次方後的數,開放後取Long+1 * @param radicand 開的N次方 * @param half n次方的一半 * @return */ static String calculate(Double srcdoubleNumber, Double radicandLongNumber, int radicand, Double half) { //如果開n次方後的數減去開的n次方的一半小於0則放棄該次計算 if (radicandLongNumber - half > 0) { List<Long> list = new ArrayList<>(radicand); for (long start = (long) (radicandLongNumber - half); start < radicandLongNumber ; start++) { Long calcNumber = 1L; //迴圈乘積,迴圈次數等於開的n次方 for (int i = 0; i < radicand; i++) { Long multiplierNumber = start + i; calcNumber = calcNumber * multiplierNumber; list.add(multiplierNumber); } //如果碰到乘積相等,則該次開方後計算此次分解成功 if (calcNumber.compareTo(srcdoubleNumber.longValue()) == 0) { return list.toString(); } //清除list list.clear(); } } return null; }
相關推薦
將一個正整數分解成連續N個正整數相乘
一個大於2的整數N,他可能等於比它小的若干個整數(大於等於2並且不等於自己)乘積。如果存在這樣的連續整數,將他們輸出,如果沒有則輸出-1。 例: 整數120,120=4*5*6或2*3*4*5。所以輸出[3,4,5],[2,3,4,5] 此處程
求一個整數分解成連續數字的和
--學習記錄論壇問題帖:http://bbs.csdn.net/topics/390416116 思路: 設輸入數字為S; 有N個連續整數(N>1),最小整數為M(M>=1),則第二為M+1...第N個則為M+N-1(也可以改設最大數) 通過分解可拆為:S=(1
匯編:將指定的內存中連續N個字節填寫成指定的內容
內存 cmp 字符 內容 sum int 條件轉移 spa style 1.loop指令實現 1 ;=============================== 2 ;循環程序設計 3 ;將制定內存中連續count個字節填寫成指定內容(te) 4 ;loop指令
【C++程式設計練習】任意給定 n 個有序整數,求這 n 個有序整數序列的最大值,中位數和最小值
題目來源 CCF模擬試題>>小中大>>201903-1 題目描述 老師給了你n個整陣列成的測量資
java如何簡單的將一個三位正整數分解成三個數
如何 tin info 三位數 new 一個 http tint sys 1 public class Leet { 2 public static void main(String[] args) { 3 Scanner scanner =
設有n個正整數,將他們連線成一排,組成一個最大的多位整數。 如:n=3時,3個整數13,312,343,連成的最大整數為34331213。
題目描述 設有n個正整數,將他們連線成一排,組成一個最大的多位整數。 如:n=3時,3個整數13,312,343,連成的最大整數為34331213。 如:n=4時,4個整數7,13,4,246連線成的最大整數為7424613。 輸入描述: 有多組測試樣例,每組測試樣例包含兩行,第一行為一
USTC機試-將正整數分解成儘可能多的連續整數之和
程式碼如下:#include<stdio.h> #define N 100 int main(){ int n; int j; printf("請輸入您的整數:"); scan
將一個正整數分解成質因數之積
/** * 檔名:Prime.java * 描述:將一個正整數分解成質因數之積 * 來源:網路 * 時間:2019.01.02 * 備註:終稿 * */ import java.util.*; public class Prime { public static void m
將整數分解成若干項相加的形式
#include<stdio.h> #define MAXN 30 int Terms[MAXN]; int count;//count表示輸出結果數 int N;//被分解的整數 void
問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數n,表示序列長度。 第二行包含n個正整數,表示給定的序列。 第三個包含一個正整數m,表
#include<iostream> using namespace std; void print(int *a,int len) { int i=0; for(;i<len;++i) cout<<i+1<<':'<<
輸入一個十進位制整數,設計遞迴函式,將該整數轉化為一個二進位制數。 思考: 如何將一個十進位制數轉化成一個8進位制和16進位制數。
1,輸入一個十進位制整數,設計遞迴函式,將該整數轉化為一個二進位制數。思考: 如何將一個十進位制數轉化成一個8進位制和16進位制數。 #include<stdio.h> #define N 20 int main() { int a,n,c,k,i; cha
【C語言】編寫一個函式,將一個數字字串轉換成這個字串對應的數字(包括正浮點數、負浮點數)
//編寫一個函式,將一個數字字串轉換成這個字串對應的數字(包括正浮點數、負浮點數) //例如:“12.34“ 返回12.34. " -12.34" 返回12.34 #include<
java 將一個ip地址分割成一個數組
代碼 一個數 數組 java str 測試 服務器 都是 其他 這個問題以前真還沒註意,好像記得分割過規律的字符串,但是不是像IP這樣是以"."為分割規律字符,而是其他的。 今天又用到類似功能,代碼寫好了也沒測試,直接上傳服務器,但是就是會報錯,之後看了日誌是ip分割部分
C 將一個單鏈表拆成3個迴圈連結串列,其中一個是純數字,一個純字母,一個其他字元
前面相關操作在這呢,這個函式依託於此 //結構體 typedef struct Node { ElementType data; struct Node * next; } LNode, * LinkNode; //將一個單鏈表拆成3個迴圈連結串列,其中一個是純數字
【經驗分享】如何將一個PDF檔案拆分成多個檔案
從事於辦公的夥伴每天都需要處理到各式各樣的辦公檔案,PDF格式的檔案就是其中的一種,有時候遇到一份PDF檔案頁面比較多,處理起來很麻煩的話我們該用什麼樣的方法呢?在這裡可以將一個PDF檔案拆分成多個檔案,這樣子就方便了很多。下面就將這種方法分享給大家!以供大家參考。 &n
HREE.JS 根據起始幀將一個AnimationClip物件分割成多個AnimationClip
THREE.JS 根據起始幀將一個AnimationClip物件分割成多個AnimationClip 因為從3dsMax裡面匯出的模型只支援一個動畫,如果需要對多個動畫進行單獨控制的話就必須將其切割成多個AnimationClip物件,其實原理跟陣列擷取是一樣的。
java將一個JFrame介面分割成多部分,每部分新增獨立背景圖片
現在,我要完成的目標是:建立了一個JFrame介面,我要分成兩部分,操作時兩部分完全獨立,互不影響,已完成的效果如下: 可以看到,我做的左邊是操作介面,右邊是顯示介面,左邊的背景我沒加,方法和右邊的是一樣的。 具體方法是這樣的,首先我建造兩個容器JPanel物件, 然後呼叫分割
BZOJ3601. 一個人的數論(高斯消元+狄利克雷卷積)及關於「前 $n$ 個正整數的 $k$ 次冪之和是 $k+1$ 次多項式」的證明
題目連結 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 題解 首先還是基本的推式子: \[\begin{aligned}f_d(n) &= \sum_{i = 1}^n [{\rm gcd}(i, n) = 1]i^d \\ &am
(動態規劃)有 n 個學生站成一排,每個學生有一個能力值,從這 n 個學生中按照順序選取kk 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 kk 個學生的能力值的乘積最大,返回最大的乘積
第2關:最強戰隊 挑戰任務 綠盟和各大名企合作,舉辦程式設計能力大賽,需要選拔一支參賽隊伍。隊伍成員全部來自“綠盟杯”中表現優秀的同學,每個同學都根據在比賽中的表現被賦予了一個能力值。現在被召集的N個同學已經集結完畢,他們按照編號依次站成了一排。 你需要編寫一個程式,從
oracle將一個欄位拆分成多個值(regexp_substr函式)
例: select regexp_substr(p.attributename, '[^,]+',1,level) c1 from tablename p connect by level &l