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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值