1. 程式人生 > >杭電acm2058————The sum problem(C語言)

杭電acm2058————The sum problem(C語言)

原題:
Problem Description

Given a sequence 1,2,3,……N, your job is to calculate all the possible sub-sequences that the sum of the sub-sequence is M.

Input

Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.

Output

For each test case, print all the possible sub-sequence that its sum is M.The format is show in the sample below.print a blank line after each test case.

Sample Input

20 10
50 30
0 0

Sample Output

[1,4]
[10,10]

[4,8]
[6,9]
[9,11]
[30,30]

題的大意是:給定一個數列1、2、3、·········、N,找出所有符合條件的子數列,即子數列的各項之和等於M,,輸入的測試用例有多組,輸入N空格M,將符合的子數列按照 [p,q] 的格式輸出。每個測試用例後面都跟一個空行。
第一次得到這種題,首先想到的就是最笨的辦法:一個一個找,反正也不是自己算。於是很容易就有了程式碼:

# include <stdio.h>
int main (){
    int m
,n,i,j,s; while (~scanf ("%d%d",&m,&n),n!=0 && m!=0){ for (i=1;i<=n;i++){ s=0; for (j=i;j<=n;j++){ s=s+j; if (s>=n){ if (s==n){ printf ("[%d,%d]\n",i,j); } break
; } } } printf ("\n"); } }

雖然巢狀的層數比較多,但是很容易理解。提交的時候,出現了(Time Limit Exceeded)這樣的判斷,也就是超時了,說明這個演算法不行。
那怎麼解決這個問題呢?
第一:先進行長度x上限的判斷,程式碼如下:

        for (i=1,s=0;s<=n;i++){//···················n代表輸入的M(所求的和)
            s+=i;
        }
        x=i-1;//··············x代表長度```

x最後減去了一是因為,經過for迴圈之後s肯定大於M,所以x減一,可以減少算數的步驟。

第二:篩選出符合要求的子數列;程式碼如下:

        for (i=x;i>=2;i--){//······讓長度依次遞減
            if (n%i==0){//·········如果平均數是整數
                p=n/i-i/2;
                q=n/i+i/2;//·········計算開始點和結束點(格式:[p,q])
            }
            else if (2*n%i==0){//·········如果平均數乘上2是整數
                p=n/i-i/2+1;
                q=n/i+i/2;//·········計算開始點和結束點(格式:[p,q])
            }
            else{
                continue;
            }
            t=(q-p+1)*(p+q)/2;//··········計算得到的數列的各元素之和,用於檢驗是否符合條件 
            if (t==n && p>0){
                printf ("[%d,%d]\n",p,q);
            }//·······如果檢驗成功就按格式輸出
        }

最後進行整理:

# include <stdio.h>
int main (){
    int m,n,i,s,x,p,q,t;
    while (~scanf ("%d%d",&m,&n),m!=0 || n!=0){
        for (i=1,s=0;s<=n;i++){
            s+=i;
        }
        x=i-1;
        for (i=x;i>=2;i--){
            if (n%i==0){
                p=n/i-i/2;
                q=n/i+i/2;
            }
            else if (2*n%i==0){
                p=n/i-i/2+1;
                q=n/i+i/2;
            }
            else{
                continue;
            }
            t=(q-p+1)*(p+q)/2;
            if (t==n && p>0){
                printf ("[%d,%d]\n",p,q);
            }
        }
        printf ("[%d,%d]\n\n",n,n);//···輸出本身的那一種情況
    }
    return 0;
}

如果有興趣,期望能和大家一起交流。
這是我第一次發表文章,還望各位大神多多包涵!!!

相關推薦

acm2058————The sum problemC語言

原題: Problem Description Given a sequence 1,2,3,……N, your job is to calculate all the possible sub-sequences that the sum of the

2058 The sum problem

The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19582    Accept

LeetCode 40. 組合總和 II Combination Sum IIC語言

題目描述: 給定一個數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的每個數字在每個組合中只能使用一次。 說明: 所有數字(包括目標數)都是正整數。 解集

HDU 2058 - The sum problem等差數列

The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 30916&n

HDU 2058:The sum problem數學

The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

ACM----------1001 Sum problem

Problem Description Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge). In this problem, your task is to calculate SUM(n) = 1

The sum problem高斯公式

The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 22089    Acce

OJ第11頁2000-2009道題C語言

月的天數 3.1 clu else 要求 max 本質 轉換 err 1. ASCII碼排序 問題描述 輸入三個字符後,按各字符的ASCII碼從小到大的順序輸出這三個字符 Input: 輸入數據有多組,每組占一行,有三個字符組成,之間無空格 Output: 對於每組輸入

E - The Blocks Problem UVA - 101

num continue blog while break ++ log pos 很多 - 題目大意 先理解給出的四個移動方式: move a onto b:把木塊a、b上的木塊放回各自的原位,再把a放到b上; move a over b:把a上的木塊放回各

LeetCode 1.兩數之和 Two Sum C語言

題目描述: 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的兩個整數。 你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。 示例 給定 nums = [2, 7, 11, 15], target = 9

LeetCode 39. 組合總和 Combination SumC語言

題目描述: 給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無限制重複被選取。 說明: 所有數字(包括 target)都是正整數。

LeetCode 64. 最小路徑和 Minimum Path SumC語言

題目描述: 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋:

The Blocks Problem 木塊問題 vector

題意:從左到右有n個木塊,編號為0~n-1  ,要求模擬一下四種操作(a,b是木塊的編號) **move a onto b:  把a和b上方的木塊全部歸位,然後把a摞在b上面。 **move a over b:  把a上方的木塊全部歸位,然後把a放在b所在木塊堆的頂部

TOJ 4171 L-The math problem水題

4171.   L-The math problem Time Limit: 1.0 Seconds   Memory Limit:65536KTotal Runs: 287   Accepted Runs:86 Given an array a with n int

acm的第1000題c語言解法

首先我選擇的是c語言的解法,開始是輸入如下的答案:#include "stdio.h"int main(void){ long long a,b; scanf("%d", &a); scanf("%d", &b); printf("%d\n", a+b);}該

自己主動化測試程序之中的一個自己定義鍵盤的模擬測試程序C語言

nds per oid 尾指針 應用 tro scan number 實現 一、測試程序編寫說明 我們做的終端設備上運行的是QT應用程序。使用自己定義的鍵盤接口。經過測試人員長時間的人機交互測試,來確認系統的功能是否滿足需求。如今須要編寫一個自己主動化

3、簡單計算機程序C語言

can ext class log cnblogs c語言 輸入 char 計算機程序 簡單計算機程序 程序代碼: /* 2017年6月30日15:35:14 功能:計算器程序,輸入兩個運算數與四則運算符,輸出計算結果 */ # include <stdio.h

自動生成小學生四則運算C語言

.html .com 它的 百度 http htm log hub .cn 我寫的這個自動生成小學生四則運算的代碼是根據我在百度上看到的一篇博客改的,地址為http://www.cnblogs.com/ys1101/p/4368103.html。它的功能不夠完整,只有整數的

終於把貪食蛇弄出來了C語言

inf pos 容易 發布 com 初學 總結 info src 真不容易,小小的貪食蛇,居然這麽有難度。 從圖片可以看出,卡頓,閃爍比較嚴重,而且比較簡陋。 初學者,做成這樣,我覺得還算不錯,恩繼續學習。 額,代碼先不貼了,先總結一下,整理好之後再發布終於把貪食蛇弄出來

【最全】經典排序算法C語言

排好序 而不是 lock wap 循環 而且 -s 關鍵字 void 本文章包括所有基本排序算法(和其中一些算法的改進算法): 直接插入排序、希爾排序、直接選擇排序、堆排序、冒泡排序、快速排序、歸並排序、基數排序。 算法復雜度比較: 算法分類 一、直接插入排序 一個