POJ NOI MATH-7829 神奇序列求和

原題鏈接

7829:神奇序列求和

總時間限制: 1000ms

內存限制: 65536kB

描述

有一個序列,初始時只有兩個數x和y,之後每次操作時,在原序列的任意兩個相鄰數之間插入這兩個數的和,得到新序列。舉例說明:

初始:1 2

操作1次:1 3 2

操作2次:1 4 3 5 2

……

問操作n次之後,得到的序列的所有數之和是多少?

輸入

三個整數x,y,n,相鄰兩個數之間用單個空格隔開。0 <= x <= 5, 0 <= y <= 5, 1 < n <= 10。

輸出

一個整數,即最終序列中所有數之和。

樣例輸入

1 2 2

樣例輸出

15

來源

《奧數典型題舉一反三(小學五年級)》 (ISBN 978-7-5445-2882-5) 模擬試卷一 第20題

題記:

       這道題可以很明顯地區分出程序員思維(計算機思維)和數學思維的不同解題辦法:程序員思維第一反應是用計算機模擬操作,數學思維是找規律,找到公式解題。

       下面分別給出兩種代碼。

程序員思維的C++代碼:

// NOI-7829:神奇序列求和
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
	int n;             //存放操作數n 
	int number[1024];  //用於模擬數列的數組 
	int count = 2;     //記錄數組中數的個數 
	int sum = 0;       //存放和 
	cin >> number[0] >> number[1] >> n;
	
	//模擬n步操作 
	for(int i=1; i<=n; i++){  
	    
	    //第二個數開始,往後移,每兩個數之間留下空位放兩數的和 
		for(int j=count-1; j>0; j--){ 
			number[2*j] = number[j];
		} 
		
		//每次操作數組多n-1個數,更新數組總數量 
	    count += (count - 1);
	    
		//中間插入左右兩數和 
		for(int j=1; j<count-1; j+=2){
			number[j] = number[j-1] + number[j+1];
		}
	}
	
	//求和
	for(int j=0; j<count; j++){
		sum += number[j];
	}
	
	cout << sum << endl; 
	return 0;
}

數學思維的C++代碼:

#include <iostream>
using namespace std;
 
int main(){
    int x, y, n, sum;
    cin >> x >> y >> n;
 
    ans = x + y;
    for(int i=0; i<n; i++){
        sum = sum * 3 - x - y;
    }
 
    cout << sum << endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章