Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;幂的随机序列的最后一位_C++_Math_Integer Arithmetic - Fatal编程技术网

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
问题:这适用于几十个测试用例(如上面的一个),但在2 101 2中失败≡ 6.
手工:

  • 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
  • 第二个递归:
    {2,2,1}
    (我们已经看到结果将是4)
    • 指数=1,下一个=2模100=2
  • 第三个递归:
    {2,2}
    • 基数:2模10=2
    • 指数:2模4+4=6
    • 下一步:26=64模100=64
  • 第四个递归:
    {64}
    • 返回64 mod 10=
      4/-错误
在某种程度上,我知道发生了什么,但我不完全确定为什么会发生在这一特定案例中,而不是几十个其他案例中。我承认我在这里已经突破了我数学知识的极限,但我得到的印象是我只是错过了拼图的一小部分


我认为这个职位已经足够长和艰巨了。如果有人对我的错误有任何见解,我会很感激一些指点。

关于一个非常大的数字的模有很多问题,而后面的许多sol'n基本上是基于基本数论的。费马的小定理、中国余数定理和欧拉的φ函数都可以帮助你解决这些问题。我建议你阅读维克多·舒普的《数论和代数计算入门》。它将帮助你更好地简化和处理数论相关的问题

现在您有
if(base!=0&&next=0)
。我相信你的意思是
next==0
@投石机确实是我做的,谢谢你指出:)不幸的是,这只是一个拼写错误。应用mod 5定理,你就会看到算法失败的地方。@eh9谢谢你的资源,我会试试的。