1. 程式人生 > >藍橋杯試題 —— 四平方和

藍橋杯試題 —— 四平方和

原題:
四平方和

四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多 4 個正整數的平方和。
如果把 0 包括進去,就正好可以表示為 4 個數的平方和。

比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2 (^ 符號表示乘方的意思)

對於一個給定的正整數,可能存在多種平方和的表示法。
要求你對 4 個數排序:0 <= a <= b <= c <= d
並對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最後輸出第一個表示法。

程式輸入為一個正整數 N (N<5000000) 要求輸出 4 個非負整數,按從小到大排序,中間用空格分開。

例如,輸入: 5 則程式應該輸出:
0 0 1 2

再例如,輸入: 12 則程式應該輸出:
0 2 2 2

再例如,輸入: 773535 則程式應該輸出:
1 1 267 838

資源約定:
峰值記憶體消耗 < 256M
CPU消耗 < 3000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main 函式需要返回 0
注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include < xxx >, 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。

嘗試作答:

#include <iostream>
#include <cmath>

using namespace std;

int trying (int i, int r[], int time = 1, int keep = 0) {
    if (time != 5) {
        double rest = sqrt (i);
        int check = static_cast<int>(rest);
        if (rest == check) {
            r[time] = check;
            i = i - check * check + keep;
            keep = 0;
            trying (i, r, ++time, keep);
        } else {
            keep++;
            i--;
            trying (i, r, time, keep);
        }
    }
    return 0;
}

int main (){
    int i,r[4];
    cin>>i;
    trying(i, r);
    for (int a = 4; a > 0; a--) {
        cout<<r[a]<<" ";
    }
    cout<<endl;

    return 0;
}

題後反思:
以上程式雖能計算出符合計算結果的 4 個正整數,但是部分結果與題目給出例項不同。
個人分析的原因是沒有對所有結果進行計算統計排序。待我研究了 “聯合主鍵升序排列” 之後再來試試。

相關推薦

藍橋試題 —— 平方和

原題: 四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多 4 個正整數的平方和。 如果把 0 包括進去,就正好可以表示為 4 個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1

藍橋/ACM 平方和(優化列舉演算法)

四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2

藍橋 8平方和

思路:一開始我用了四個迴圈,但是這個有超時的危險,於是,d可以由a,b,c,n推出來; 程式碼: #include<cstdio> #include<algorithm&g

藍橋試題平方和 java(窮舉)

import java.util.Scanner; /* 練習題:四平方和 四平方和定理,又稱為拉格朗日定理:每個正整數都可以表示為至多四個正整數的平方和。如果把 0 包括進去, 就正好可以表示為四個數的平方和。 比如: 5=02+02+12+22 7=12+12+12+22 則對於一個給定的

藍橋 第七屆省賽試題 平方和

四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7

2013年第藍橋試題(Java本科B組)

1.標題: 世紀末的星期 曾有邪教稱1999年12月31日是世界末日。當然該謠言已經不攻自破。 還有人稱今後的某個世紀末的12月31日,如果是星期一則會.... 有趣的是,任何一個世紀末的年份的12月31日都不可能是星期一!!  於是,“謠言製造商”又修改為星期日....

2013年第藍橋試題(C/C++本科B組)

1 大數學家高斯有個好習慣:無論如何都要記日記。     他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210     後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,

藍橋試題

aaa 組合 fin std ext 如果 != ever 女朋友 藍橋杯搜索模擬暴力題: 題目: 手鏈樣式 小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。 他想用它們串成一圈作為手鏈,送給女朋友。 現在小明想知道:如果考慮手鏈可以隨意轉動或翻轉,一共可以有多少不同的組合樣式呢

藍橋試題:十六進位制轉10進位制

問題描述   從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。   注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入 FFFF 樣例輸出 65535 import java.util.Sc

2015年第六屆藍橋試題(C/C++本科B組)

1 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(10-99),要求其中不要出現帶“4”的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。 請

歷屆藍橋試題- 迴文數字(C語言)

問題描述   觀察數字:12321,123321 都有一個共同的特徵,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做:迴文數字。 本題要求你找到一些5位或6位的十進位制數字。滿足如下要求:   該數字的各個數位之和等於輸入的整數。 輸入格式   一個正整數 n (10<n

2017年第八屆藍橋試題(C/C++本科B組)1-8題

1.標題: 購物單    小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。    這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。    小明也有個怪癖,不到萬不得已,從不刷卡,直接

2016年第七屆藍橋試題(C/C++本科B組)

3.湊算式      B      DEF A + --- + ------- = 10      C      GHI       (如果顯示有問題,可以參見【圖1.jpg】)   這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。 比如: 6+8/3+952/

藍橋屆 黃金連分數(大數 斐波那契數列與黃金分割)

題目描述 標題: 黃金連分數 黃金分割數0.61803... 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。 對於某些精密工程,常數的精度很重要。也許你聽說過哈

java藍橋試題高精度加法

import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc=new Scanner(System.in);   

java藍橋試題時間轉換(java)

import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc=new Scanner(System.in);   

藍橋試題集分類

每道題目都是連結,點選了之後需要登入才能訪問。 每個分類下空行隔開了不同難度,基本上越往下越難。 遞推求值 蘭頓螞蟻 分糖果 小朋友排隊 週期字串 迴文數字 並查集: 連號區間數 國王的煩惱 後兩類不加連結了

藍橋題 位平方和

把一個整數的每個數位都平方後求和,又得到一個整數,我們稱這個整數為:位平方和。 對新得到的整數仍然可以繼續這一運算過程。 比如,給定整數為4,則一系列的運算結果為:#include<stdio.h> int a[410]; int pingfanghe(int

2014年第五屆藍橋試題(Java本科B組)

1.標題:武功祕籍     小明到X山洞探險,撿到一本有破損的武功祕籍(2000多頁!當然是偽造的)。他注意到:書的第10頁和第11頁在同一張紙上,但第11頁和第12頁不在同一張紙上。     小明只想練習該書的第81頁到第92頁的武功,又不想帶著整本書。請問他至少要撕下多

藍橋試題集 演算法訓練 大小寫轉換

  演算法訓練 大小寫轉換   時間限制:1.0s   記憶體限制:512.0MB 問題描述   編寫一個程式,輸入一個字串(長度不超過20),然後把這個字串內的每一個字元進行大小寫