偶数之和

题目:

描述 Description
输入正整数m、n的值,输出区间【m,n】内所有偶数之和
输入格式 Input Format
只有一行有二个正整数:m n
(1<=m<=n<=10^12)
输出格式 Output Format
只有一行且只有一个正整数:区间[m,n]内所有的偶数之和

分析:

先看数据,一幅高精度的样子。肯定不能是循环求,所以用公式(高斯求和)。我们可以得到公式

(a+b)×((ba)÷2+1)÷2

但这样就需要高精度乘法和高精度除法,可以变形,得到
(a+b)÷2×((ba)÷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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值