1. 程式人生 > >每個數均可表示成若干個完全平方數(1,4,9,16,25……)之和

每個數均可表示成若干個完全平方數(1,4,9,16,25……)之和

JAVA程式設計:每個數均可表示成若干個完全平方數(1,4,9,16,25……)之和,完全平方數是可重複,求出n的一種組合要求完全平方數的個數最少。如:12=4+4+4;13=4+9

package test;
import java.util.Scanner;
public class Main {
    static int data[]=new int[10000001];
    public static void main(String args[]){
//        int n=new Scanner(System.in).nextInt();
//        System.out.println(Method(n));
    	method();
    }
    static int Method(int n){
        //如果n是完全平方數,返回結果 只需一次 遞迴出口
        if(Math.pow((int)Math.sqrt(n),2)==n){
            return 1;
        }else{
            if(data[n]!=0){
                return data[n];
            }
            //窮舉 如果13,就窮舉1+12  2+11 ……
            //當執行f(1)+f(12)時
            //f(1)=1, f(12)再執行窮舉,依次類推
            //最終得出最少次數,比如f(4)+f(9)=2,即為最終結果.
            int min=Method(n-1)+Method(1);
            for(int i=1;i<=n/2;i++){
                if(Method(i)+Method(n-i)<min){
                    min=Method(i)+Method(n-i);
                }
            }
            data[n]=min;
            return min;
        }
    }
    static void method(){
    	 System.out.println("請輸入一個正整數:");
    	 Scanner sc = new Scanner(System.in);
         int num = sc.nextInt();
         boolean flag = true;
         int count = 0;
         String str ="";
         while(flag){
             int a = (int) Math.sqrt(num);//開根
             int n_x = (int) (num - Math.pow(a, 2));//number-最大完全平方數
             num = n_x;
             if(n_x == 0){
                 flag = false;
             }
             if(count==0){
                 str = str + (int)Math.pow(a, 2);
             }else{
                 str = str + "+" + (int)Math.pow(a, 2);
             }
             count++;
         }
         System.out.println("總個數"+count+"\t"+str);
    }
}


相關推薦

個數表示若干完全平方1491625……之和

JAVA程式設計:每個數均可表示成若干個完全平方數(1,4,9,16,25……)之和,完全平方數是可重複,求出n的一種組合要求完全平方數的個數最少。如:12=4+4+4;13=4+9 package test; import java.util.Scanner; publi

個數加上100是完全平方,再加上168又是一個完全平方, (含優化)

public class HisTime {       public static void main(String[] args) {           long startTime = System.currentTimeMillis();           

編寫一個程式求出滿足下列條件的四位數:該完全平方且第一、三位數字之和為10第二、四位數字之積為12

編寫一個程式,求出滿足下列條件的四位數:該數是個完全平方數,且第一、三位數字之和為10,第二、四位數字之積為12 程式碼: #include <stdio.h> #include <math.h> //編寫一個程式,求出滿足下列條件的四位數: //該數是個

求給定等於最少的幾完全平方之和

given an integer ,find 最小長度minlen 的expression of integer, minlen 定義為多少個完全平方數相加?例如 14 = 1 + 4 + 9, minlen = 3int MinExpressionInteger(int

將自然數1--9這九個數分成三組組的三數字拼三位數每個數字不能重複且每個三位數都是完全平方。請找出這樣的三三位數。

program p1;var a:array[1..3]of integer;    i,j,k,x:integer;function yes:boolean;var i:integer;    d:set of 0..9;begin d:=[]; for i:=1 to 3 do  d:=d+[a[i] d

2的n次冪判斷一個數是否能寫m2相乘LeetCode 231號問題 給定一個整數編寫一個函式來判斷它是否是 2 的冪次方。

2的n次冪,判斷一個數是否能寫成m個2相乘,LeetCode 231號問題 給定一個整數,編寫一個函式來判斷它是否是 2 的冪次方。 示例 1: 輸入: 1 輸出: true 解釋: 20 = 1 示例 2: 輸入: 16 輸出: true 解釋: 24 = 16 示例 3:

把一個數組最開始的若干元素搬到陣列的末尾我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉輸出旋轉陣列的最小元素。

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。 /*

哥德巴赫猜想:任何一個>=4之偶數,都可以表示奇質數之和.

任何一個>=4之偶數,都可以表示成兩個奇質數之和. 分析思路: 1.給定一個範圍,找出這個範圍裡面的所有質數(用空間換時間,效能提高),將其儲存到一個數組中 2.使用迴圈,將這個範圍 和 質數陣列 傳入 一個方法,判斷是否成立。找出所有大於4的偶數

數論概論讀書筆記 25.哪些平方之和

哪些數可表成兩個平方數之和 對於一個正整數mm ,如果mm每個素因子都可以表示成兩個平方數之和,則素因子分解後,用公式 (u2+v2)(A2+B2)=(uA+vB)2+(vA−uB)2(u2+v2)

求一個數最少能表示個數的平方和(比如5=1+4返回2)

bool is_sqrt(long long n) { int m = sqrt(n); if (m*m == n) return true; else

有一個正整數N可以分解若干正整數之和問如何分解能使這些的乘積最大?

著作權歸作者所有。 商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 作者:人子立 連結:https://www.zhihu.com/question/30071017/answer/4758474

經典問題:字串分割多少相同重疊/不重疊子串(2087)

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from th

762. 二進位制表示中質數計算置位 二進位制1個數

給定兩個整數 L 和 R ,找到閉區間 [L, R] 範圍內,計算置位位數為質數的整數個數。 (注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。) 示例 1: 輸入: L = 6, R = 10

把一個數組最開始的若干元素搬到陣列的末尾我們稱之為陣列的旋轉。

// 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉

Java中從m個數中隨機選取n不同的m>=n並進行排序

我這裡直接給出我寫的函式,只需傳入引數便可直接使用://從x-y中的數中隨機找出num個不同的數,返回給integer的動態陣列中ArrayList<Integer> makeRandom(int x, int y, int num)      {        

1000個數範圍[0,999],有2相同的,求這個數

import java.util.Arrays; public class SearchDemo { /** *被搜尋資料的大小 */ private static final int siz

面試題: 求N個數中前k大的大資料

解題思路:一般思路就是將N個數排序後,取前k個數就ok。但是如果N個數是幾十億個數,載入不到記憶體怎麼辦?這就需要另外一種思路了,那就是利用堆。 具體的思路是:先建一個k個數的小堆,然後從k+1個數往

hibernate多對多對映拆2一對多對映註解

hibernate的many to many確實很是方便我們處理實體和集合間的關係,並可以通過級聯的方法處理集合,但有的時候many to many不能滿足我們的需要,比如 使用者<--->選課,典型的多對多關係,一般情況下,會生成 course_user(course_id,user_id);