1. 程式人生 > >將一個正整數分解成連續N個正整數相乘

將一個正整數分解成連續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

輸入一個十進位制整數,設計遞迴函式,整數轉化為一個二進位制數。 思考: 如何一個十進位制數轉化一個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