[这个算是找规律???]一序列

【题目】

如果一个以0开头的整数序列任意两个相邻的项相差为1或-1,则我们说这个整数序列是‘一序列’。更清楚的,如果序列[a1,a2,……an]满足以下条件,则是一个一序列。

1、对于任何的k,1<=k<n ,满足|ak-ak+1|=1

2、a1=0。

1、从输入文件中读入序列的长度和序列的总和。

2、找出一个给定长度的序列,使它的总和等于给定的值。

3、将结果写入输出文件

【输入】

输入文件第一行是一个整数n,1<=n<=100,0000,表示序列的长度,第二行包含一个整数s,|s|<=50000000,表示序列的总和。

【输出】

如果这样的序列不存在,则输出‘NIE’。否则,输出n个数,表示所求的序列,n个数的和等于s。

【样例输入】

8

4

【样例输出】

0

1

2

1

0

-1

0

1

【分析】

首先说明,这个题目是多解的。

很懒了啦~ 粘别人的题解来咯。

不难想到n个数和的最大值与最小值分别为n*(n-1)div 2 -n*(n-1)div2,设MAX表示最大值,那么最小值为-MAX。显然,如果S不在-MAXMAX的范围内,本题一定无解。而且由于相邻两个数的差为1,所以数列应该是偶、奇、偶、奇、……这样排列,因此n个数的和的奇偶情况应该是一定的,如果SMAX不是同偶或同奇该问题也无解。

接下来我们该考虑如何构造数列。当N=4时将所有的数列按和从大到小排列如下:

01 2 3 ),

01 2 1),

01 0 1),

0–1 0 1),

0–1 0 –1),

0–1 –2 –1

0–1 –2 –3

我们可以看到,这些数列间存在一些规律。假设(01 23)为初始数列,从最后一个数开始,从后往前每次将一个数减二,一直减到数列中的第2个数,接着再次从最后一个数开始减,一直减到数列中的第3个数。最后仍然从最后一个数开始,一直减到数列中的第n个数。按这种方法使得数列的和每次减二,可以产生出所有的数列。这种方法也可以推广到一般的情况,假设数列中有n个数,且初始数列为(012……n),每一轮从第n个数开始减起,每次将一个数减二,生成一个新的数列,第I轮要减到数列中的第I+1个数,总共要减n-1轮,这样可以按总和从大到小的顺序产生出所有的数列。分析到这我们也可以证明如果输入的整数S-MAXMAX的范围内且SMAX同奇偶,该问题一定有解。

题解结束。代码什么的,恩。很好实现……忽略(我不是没写的说!!!)。


转载于:https://www.cnblogs.com/sephirothlee/archive/2010/09/11/1824088.html

为了改进上述代码以支持更复杂的算式操作,你需要添加以下几个关键功能: 1. **运算符处理**:引入更多的输入按键来识别不同的运算符(如+、-、*、/),并有一个状态机来跟踪当前操作。例如,当遇到运算符时,可以改变显示模式从数字切换到运算符。 2. **优先级和括号处理**:计算表达式的顺很重要,需要根据运算符的优先级(如先乘除后加减,先括号内后括号外)来解析输入。 3. **临时变量**:创建内存空间来存储中间结果,每一步运算后更新临时变量,直到整个表达式结束。 4. **栈结构**:你可以使用堆栈来存储待计算的元素和运算过程,比如使用一个字符数组来模拟栈,当遇到新的运算符时,将操作数入栈,运算符则作为指令压栈。 5. **用户提示**:增加提示信息告知用户正在处理的运算符和结果,直到最终结果显示出来。 6. **错误处理**:检查用户的输入是否合法,如除数不能为零,输入的不是有效的数字或运算符等。 以下是修改后的简化代码框架: ```c typedef struct { char operator_char; char operand1, operand2; } Expression; Expression stack[STACK_SIZE]; int top = -1; void process_operator(char op) { // 实现运算操作 } void process_number(char num) { // 更新临时变量 } void parse_expression() { // 扫描输入,处理运算符和数字 } void calculate() { while(top > -1) { process_operator(stack[top].operator_char); --top; } display(result); } void main() { parse_expression(); calculate(); } ``` 注意:这仍然是一个简化的概述,实际实现会涉及到更多细节,如错误处理、循环终止条件等。你可能需要参考相关的嵌入式编程教程或查阅更详细的资料来进行深入学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值