题目:
描述 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]:=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.