偶数之和
2015-05-16 11:17
197 查看
题目:
描述 Description输入正整数m、n的值,输出区间【m,n】内所有偶数之和
输入格式 Input Format
只有一行有二个正整数:m n
(1<=m<=n<=10^12)
输出格式 Output Format
只有一行且只有一个正整数:区间[m,n]内所有的偶数之和
分析:
先看数据,一幅高精度的样子。肯定不能是循环求,所以用公式(高斯求和)。我们可以得到公式(a+b)×((b−a)÷2+1)÷2但这样就需要高精度乘法和高精度除法,可以变形,得到(a+b)÷2×((b−a)÷2+1)
于是看成两式之积,用一个高精度乘法。
代码:
var n,m,x,y:qword; //因为读入数据有10^12,所以要用qword a,b,c:array[1..100000] of longint; st1,st2:ansistring; k,len1,len2,i,j:longint; begin read(m,n); if (m mod 2=0) and (m=n) then //特殊情况判断(若m为偶数且m等于n时,偶数之和为m) begin write(m); exit; //记得退出 end; if (m mod 2=1) and (m=n) then //特殊情况判断(若m为奇数且m等于n时,偶数之和为0) begin write(0); exit; //记得退出 end; if (m mod 2=1) and (m<>n) then m:=m+1; //为了契合公式,若m为奇数(并判断不是特殊情况)则m+1 if (n mod 2=1) and (m<>n) then n:=n-1; //为了契合公式,若n为奇数(并判断不是特殊情况)则n-1 x:=(n+m) div 2; //算出第一个式子 y:=(n-m) div 2+1; //算出第二个式子 str(x,st1); //赋为字符串 len1:=length(st1); //求出结果的长度 str(y,st2); //赋为字符串 len2:=length(st2); //求出结果的长度 for i:=1 to len1 do a[i 9739 ]:=ord(st1[-i+1])-48; //循环赋给数组用来进行高精度运算 for i:=1 to len2 do b[i]:=ord(st2[len2-i+1])-48; //循环赋给数组用来进行高精度运算 for i:=1 to len1 do //高精度乘法 for j:=1 to len2 do begin c[i+j-1]:= c[i+j-1]+a[i]*b[j]; //单位相乘 c[i+j]:=c[i+j]+c[i+j-1] div 10; //进位处理 c[i+j-1]:=c[i+j-1] mod 10; end; if c[len1+len2]>0 then n:=len1+len2 else n:=len1+len2-1; //求出最后运算结果的位数 for i:=n downto 1 do //倒序输出 write(c[i]); end.
相关文章推荐
- 【追求进步】调整数组顺序使奇数位于偶数前面
- UVa 11464 偶数矩阵 枚举
- 调整数组顺序使奇数位于偶数前面
- 剑指Offer--014-调整数组顺序使奇数位于偶数前面
- C++实验4-求1000以内所有偶数的和
- [剑指offer]调整数组顺序使奇数位于偶数前面
- CSS中如何选择ul下li的奇数、偶数行
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
- 调整数组中所有奇数位于偶数之前
- 调整数组顺序使奇数位于偶数前面
- 调整数组使奇数全部都位于偶数前面。
- 求出用数字0到9可以组成多少个没有重复数字的三位偶数。
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 【剑指offer】调整数组顺序使奇数位于偶数前面
- 将偶数的二进制反转
- 【刷题之路】调整数组顺序使奇数位于偶数前面
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数
- 剑指offer eg11 调整数组顺序使 奇数位于偶数前面
- Java算法——求1到100的偶数和,奇数和
- PHP实例:判断输入的数字是奇数还是偶数