One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that he placed signs + and - between every pair of adjacent digits alternately. Now he wants to find the value of the expression he has made. Help him.
For example, if N=12 then +1 -2 +3 -4 +5 -6 +7 -8 +9 -1+0 -1+1 -1+2 = 5
Input
Each line contains one integer number N (1≤ N ≤ 1015). Last line contains 0 and shouldn't be processed. Number of lines in the input does not exceed 40.
Output
For every line in the input write the answer on a separate line.
Example
Input:
Output:
【算法分析】
题意:
将1~N(1<=N<=10^15)写在纸上,然后在相邻的数字间交替插入+和-,求最后的结果。例如当N为12时,答案为:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5。
分析:
我们先把数列出来,会找到一个规律
-1+0
-1+1
……
-1+9
-2+0
-2+1
……
-9+9
-1+0-0
+1-0+1
-1+0-2
+1-0+3
……
+1-9+9
-2+0-0
…………
如果数位为偶数,那么对应位的符号都一样,并且第一个符号为负,交替改变;
如果数位为奇数,那么每一位符号都是交错的,可以两两抵消(上下),只需计算个位即可。
所以我们设计一下状态,需要一个pre记录上一位,以便数位为奇数时计算最后一位;一个sum表示各位数符号交替之和,用于数位为偶数时的计算;一个sub表示当前数位的符号(+/-);一个state表示数位是奇数还是偶数。(ate=0表示当前奇偶不确定,即前面枚举的数位全都是0;state=1表示当前数位为奇数;state=2表示偶数)
具体实现过程看代码
数位DP不仅可以进行数的统计,还可以进行数位的运算