gpt4 book ai didi

c++ - C++中对数组的误解

转载 作者:太空宇宙 更新时间:2023-11-04 13:54:30 25 4
gpt4 key购买 nike

首先,这不是“这是我的代码,有什么问题?”问题。相反,它是“这是我的代码,这就是问题所在,我误解了数组的哪一部分?”。我希望这些问题之间的区别意味着这篇文章不会惹恼太多人;我希望提高自己的知识,而不是让其他人为我工作。

我确定我遇到的问题是由于我对数组工作原理的理解中的一个基本问题(希望容易解释)。我是自学成才的,我的问题太具体了,无法从 Google 寻求任何帮助。

我将快速解释我的代码的每一部分的作用,以防它很重要,如果这无关紧要(它应该是 RSA 算法的加密部分),我深表歉意:

int returnVal (char x)
{
return (int) x - 87;
}

这会将字母转换为数字,a=10, b=11, ... z=35。

unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
unsigned long long remainder;
int x = 1;

while (e != 0)
{
remainder = e % 2;
e= e/2;

if (remainder == 1)
x = (x * b) % m;
b= (b * b) % m;
}
return x;
}

这部分只是我自己的模幂和化简函数,根据:a ^ b (mod n) = a ^ c (mod n) * a ^ d (mod n) where c + d = b。它是为了允许快速使用大值(并且还避免了浮点错误)。这个函数本身运行良好(很多答案已经使用 wolfram alpha 检查过)但我已经包含它以防与我的数组结合时出现某种错误。

int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)

{
std::cout << modExp (returnVal(s[i]), e, n);
}
}

这是我遇到问题的地方,我正在尝试使用数组将“ab”组合成“1011”,然后执行 RSA 算法。 目前它正在执行 10 ^ 7 (mod 10403) = 2717 和 11 ^ 7 (mod 10403) = 2352 并给出“27172352”的输出。我想要发生的是让它执行 1011 ^ 7 (mod 10403) = 2122 并将其作为输出(对于那些直接跳到问题的人,我将这部分加粗)。

显然,我尝试使用数组将“ab”与“1011”组合起来的尝试是错误的。我的问题是为什么错了?有没有办法调整它以使其正确?如果不是,我应该采用什么新方法来将这些数字组合在一起?

如果问题有点长,我很抱歉,但我宁愿过于具体也不愿过于模糊,感谢您的任何反馈,我将在下面粘贴我的代码,以便将它们放在一个地方。 (此外,我使用的是 unsigned long long,因为通常 p 和 q 会大得多)

#include <iostream>
#include <sstream>
#include <string>
#include <math.h>

int returnVal (char x)
{
return (int) x - 87;
}

unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
unsigned long long remainder;
int x = 1;

while (e != 0)
{
remainder = e % 2;
e= e/2;

if (remainder == 1)
x = (x * b) % m;
b= (b * b) % m;
}
return x;
}

int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)

{
std::cout << modExp (returnVal(s[i]), e, n);
}
}

最佳答案

如果我理解正确的话:

您需要做的就是让 returnVal 接受 char *std::string 并将整个字符串传递给它你有。然后它应该一个一个地转换字符并添加(在你将 out 变量乘以 100 之后,假设你想坚持使用十进制数字)到一个(可能是巨大的)整数输出。不过,我建议改用十六进制,因为它应该更快(移位与乘以 100 相比)。

编辑:

该函数看起来类似于:

unsigned long long returnVal(char *str, size_t length){

unsigned long long result = 0;

for(unsigned int i=0;i<length;++i){
// Do stuff :D
}

return result;

}

我将 int 更改为 unsigned long long 因为值会很快变大。不过,在现实世界的实现中,它还是太小了。

关于c++ - C++中对数组的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com