您的位置:首页 > 其它

偶数之和

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pascal 高精度