C++ C++;幂的随机序列的最后一位
我意识到有几个主题已经涵盖了这一点。但我的问题不在于如何构建这样一个算法,而在于找出我在实现中犯了哪些错误导致几十个测试中的一个失败 挑战:提供随机数的C++ C++;幂的随机序列的最后一位,c++,math,integer-arithmetic,C++,Math,Integer Arithmetic,我意识到有几个主题已经涵盖了这一点。但我的问题不在于如何构建这样一个算法,而在于找出我在实现中犯了哪些错误导致几十个测试中的一个失败 挑战:提供随机数的std::list,确定x1^(x2^(x3^(…^xn))的最后一位。。这些数字足够大,或者列表足够长,结果是天文数字,无法用传统方法处理 我的解决方案:我选择使用模块化算术方法。简言之,这些巨大幂的最后一位数字将与由基数的第一位数字(mod 10)组成的缩减幂相同,被提升到指数的最后两位(mod 100)。幂序列中的单位最多以4的模式重复,因
std::list
,确定x1^(x2^(x3^(…^xn))的最后一位。
。这些数字足够大,或者列表足够长,结果是天文数字,无法用传统方法处理
我的解决方案:我选择使用模块化算术方法。简言之,这些巨大幂的最后一位数字将与由基数的第一位数字(mod 10)组成的缩减幂相同,被提升到指数的最后两位(mod 100)。幂序列中的单位最多以4的模式重复,因此我们可以使用mod 4来减少指数,偏移4以避免0的余数。至少,这是我迄今为止基于以下资源对它的理解:/
#包括
#包括
最后一位整数(标准::列表arr)
{
//中断条件,提取最后一位
如果(arr.size()==1)返回arr.back()%10;
if(arr.size()==0)返回1;
//提取列表中的最后两项
std::list power(std::prev(arr.end(),2),arr.end());
返回;
//将它们视为此递归的基和指数
长基线=power.front(),指数=power.back(),next;
//计算当前功率
开关(指数)
{
案例0:next=1;中断;
案例1:下一个=基准%100;中断;
默认值:next=(长)std::pow(基数%10,指数%4+4)%100;
}
如果(基本!=0&&next==0)next=100;
//将其添加为列表中的最后一项
arr.push_back(下一步);
//递归处理列表中的下两项
返回最后一位数字(arr);
}
随机示例:123232 694027 140249≡ 八,
- 第一次重现:
{123'232,694'027,140'249}
- 基数:694027模10=7
- 指数:140249模4+4=5
- 下一步:75=16807模100=7
- 第二个递归:
{123'232,7}
- 基数:123232模10=2
- 指数:7模4+4=7
- 下一个:27=128模100=28
- 第三个递归:
{28}
- 返回:28 mod 10=
8
- 返回:28 mod 10=
手工:
- 1012=10201
- 210201模4=0,+4=4
- 24=16
/6-正确
- 第一个递归:
{2,2,101,2}
- 基数:101模10=1
- 指数:2模4+4=6
- 下一步:16=1模100=1
- 第二个递归:
(我们已经看到结果将是4){2,2,1}
- 指数=1,下一个=2模100=2
- 第三个递归:
{2,2}
- 基数:2模10=2
- 指数:2模4+4=6
- 下一步:26=64模100=64
- 第四个递归:
{64}
- 返回64 mod 10=
4/-错误
- 返回64 mod 10=
我认为这个职位已经足够长和艰巨了。如果有人对我的错误有任何见解,我会很感激一些指点。关于一个非常大的数字的模有很多问题,而后面的许多sol'n基本上是基于基本数论的。费马的小定理、中国余数定理和欧拉的φ函数都可以帮助你解决这些问题。我建议你阅读维克多·舒普的《数论和代数计算入门》。它将帮助你更好地简化和处理数论相关的问题 现在您有
if(base!=0&&next=0)
。我相信你的意思是next==0
@投石机确实是我做的,谢谢你指出:)不幸的是,这只是一个拼写错误。应用mod 5定理,你就会看到算法失败的地方。@eh9谢谢你的资源,我会试试的。