早教吧作业答案频道 -->其他-->
整数乘方有问题?给定两个非负整数a,b和一个正整数m,求a的b次方除m的余数.要计算这个问题,可以将a连乘b次,每次都对m求余,但这种方法特别慢,当b较大时无法使用.下面给出一种较快的
题目详情
整数乘方有问题?
给定两个非负整数a,b和一个正整数m,求a的b次方除m的余数.
要计算这个问题,可以将a连乘b次,每次都对m求余,但这种方法特别慢,当b较大时无法使用.下面给出一种较快的算法(用a^b表示a的b次方):
若b=0,则a^b%m=1%m.
若b为偶数,则a^b%m=(a^(b/2)%m)^2%m,即先把a乘b/2次方对m求余,然后再平方后对m求余.
若b为奇数,则a^b%m=(a^(b-1)%m)*a%m,即先求a乘b-1次方对m求余,然后再乘a后对m求余.
这种方法速度较快,请使用这种方法计算a^b%m,其中m不大于10000.
这是一道完善程序的试题,你只需要在下面程序标注的“@你的代码”的位置补充适当的语句或语句段使程序能正确运行即可,在提交的时候,你要提交的内容只包括补充的内容,不包括其他的代码.
#include
#include
#include
using namespace std;
int exp(int a,int b,int m)
{
@你的代码
}
我贴的代码是:
if(b==0) //0:1%m
return (1%m);
else
{
if(b%2==0) //偶数:(a^(b/2)%m)^2%m
{
int middle=1,i,q; //在复合语句中定义的变量作用域为复合语句
q=b/2;
while(q>=1)
{
middle=a*middle;
q--;
}
return (middle%m)*(middle%m)%m;
}
else //奇数:a^(b-1)%m*a%m
{
int middle=1,i,q;
q=b-1;
while(q>=1)
{
middle=a*middle;
q--;
}
return middle%m*a%m;
}
}
给定两个非负整数a,b和一个正整数m,求a的b次方除m的余数.
要计算这个问题,可以将a连乘b次,每次都对m求余,但这种方法特别慢,当b较大时无法使用.下面给出一种较快的算法(用a^b表示a的b次方):
若b=0,则a^b%m=1%m.
若b为偶数,则a^b%m=(a^(b/2)%m)^2%m,即先把a乘b/2次方对m求余,然后再平方后对m求余.
若b为奇数,则a^b%m=(a^(b-1)%m)*a%m,即先求a乘b-1次方对m求余,然后再乘a后对m求余.
这种方法速度较快,请使用这种方法计算a^b%m,其中m不大于10000.
这是一道完善程序的试题,你只需要在下面程序标注的“@你的代码”的位置补充适当的语句或语句段使程序能正确运行即可,在提交的时候,你要提交的内容只包括补充的内容,不包括其他的代码.
#include
#include
#include
using namespace std;
int exp(int a,int b,int m)
{
@你的代码
}
我贴的代码是:
if(b==0) //0:1%m
return (1%m);
else
{
if(b%2==0) //偶数:(a^(b/2)%m)^2%m
{
int middle=1,i,q; //在复合语句中定义的变量作用域为复合语句
q=b/2;
while(q>=1)
{
middle=a*middle;
q--;
}
return (middle%m)*(middle%m)%m;
}
else //奇数:a^(b-1)%m*a%m
{
int middle=1,i,q;
q=b-1;
while(q>=1)
{
middle=a*middle;
q--;
}
return middle%m*a%m;
}
}
▼优质解答
答案和解析
我想说,其实这是一个递归问题⋯⋯
如果是我的话,会这么写程序⋯⋯还有楼主你根本没提问嘛
int exp(int a,int b,int m)
{
if(b == 0)
return 1%m;
if(b%2 == 0)
{
int t = exp(a,b/2,m);
t*=t;
return t%m;
}
else
{
int t = exp(a,b-1,m);
return (t*a)%m;
}
}
如果是我的话,会这么写程序⋯⋯还有楼主你根本没提问嘛
int exp(int a,int b,int m)
{
if(b == 0)
return 1%m;
if(b%2 == 0)
{
int t = exp(a,b/2,m);
t*=t;
return t%m;
}
else
{
int t = exp(a,b-1,m);
return (t*a)%m;
}
}
看了 整数乘方有问题?给定两个非负...的网友还看了以下:
一个数学压轴题最后一问,-只求第三问如图,在平面直角坐标系中,已知点A(-3,6),点B,点C分别在 2020-03-31 …
有两个疑问,一.比如x大于负无穷小于3.中的负无穷是小于0的全部数还是小于3的全部数.二,已知f( 2020-05-14 …
设A*为四阶方阵A的伴随矩阵,且|A*=8,则|2(A的平方)的负一次方|=8,则|2(A的平方) 2020-05-15 …
关于x的方程2x² -(4k+1)x+2k²-1=0⑴有两个不相等的负实数根,求实数根k的范围?⑵ 2020-05-16 …
线性代数的一道数学题目,很二b已知三阶实对称矩阵A的两个特征值是0和-2(负2),且r(A)=2, 2020-05-16 …
求根公式二次函数求根公式x = [-b±√(b2-4ac)]/(2a),请问前面的负号有何用处?正 2020-05-16 …
求问对称三角形联接的负载与对称星形联接的电源相接的计算题!对称三角形联接的负载与对称星形联接的电源 2020-05-17 …
资源控制是安全管控平台接入平台中负责对接入后的访问请求,访问过程以及访问行为进行安全控制管理的重要功 2020-05-31 …
关于篮球比赛排名的疑问关于篮球比赛排名的问题:五只球队参赛,根据赛前规定,胜积2分,负积1分,积分 2020-06-12 …
工程力学二力矩的正负问题求一个力对一个点的力矩,假设F竖直向下那么力矩求得正还是负?竖直向下呢?水 2020-06-12 …