题目地址:http://contest-hunter.org:83/contest/0x00「基本算法」例题/0102 64位整数乘法
做法1: 类似于快速幂
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long mul(long long a,long long b,long long p)
{
long long m=0;
while(b>0)
{
if(b&1)
m=(m+a)%p;
b=b>>1;
a=(a+a)%p;
}
return m;
}
int main()
{
long long a,b,p;
scanf("%lld%lld%lld",&a,&b,&p);
a=a%p; b=b%p;
a=mul(a,b,p);
printf("%lld\n",a);
return 0;
}
做法2:利用浮点数与long long的自动溢出的取舍机制与%p(说实话,我也没懂)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
long long a,b,p;
scanf("%lld%lld%lld",&a,&b,&p);
a=a%p; b=b%p;
long long c=(long double)a*b/p;
long long ans=a*b-c*p;
if(ans<0)
ans+=p;
else
if(ans>=p)
ans=ans-p;
printf("%lld\n",ans);
return 0;
}