C++ 对C+中数组的误解+;

C++ 对C+中数组的误解+;,c++,arrays,rsa,C++,Arrays,Rsa,首先,这不是一个“这是我的代码,有什么问题?”的问题。相反,它是一个“这是我的代码,这是问题所在,我误解了数组的哪一部分?”。我希望这些问题之间的区别意味着这篇文章不会惹恼太多人;我希望提高我的知识水平,而不是让别人为我工作 我确信我遇到的问题是由于我在理解数组如何工作时遇到了一个基本问题(希望很容易解释)。我是自学成才的,我的问题太具体了,无法从谷歌那里找到任何帮助 我将快速解释代码的每一部分在重要情况下的作用,如果这与此无关,请抱歉(它被假定为RSA算法的加密部分): 这将字母转换为数字,其

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

我确信我遇到的问题是由于我在理解数组如何工作时遇到了一个基本问题(希望很容易解释)。我是自学成才的,我的问题太具体了,无法从谷歌那里找到任何帮助

我将快速解释代码的每一部分在重要情况下的作用,如果这与此无关,请抱歉(它被假定为RSA算法的加密部分):

这将字母转换为数字,其中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),其中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);
    }
}
intmain()
{
无符号长p=101;
无符号长q=103;
int e=7;
无符号长n=p*q;
std::string s=“ab”;
for(无符号长i=0;i如果我理解正确:

您需要做的就是让
returnVal
接受
char*
std::string
并将您拥有的整个字符串传递给它。然后它应该将字符逐个转换,并将(在您将out变量乘以100之后,假设您希望使用十进制数字)添加到a(可能很大)整数输出。尽管如此,我还是建议使用十六进制,因为它应该快得多(按位移位vs乘以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;

}
unsigned long-long-returnVal(char*str,size\t-length){
无符号长结果=0;
对于(unsigned int i=0;i),显然我试图使用数组将“ab”组合为“1011”是错误的

当然,字符串数组中的每个元素都是一个单独的字母,s[0]=='a',s[1]=='b'。 数组元素无法“组合”

您可以将两位十进制数字组合为:

int left  = returnVal('a');  // decimal 10
int right = returnVal('b');  // decimal 11

int result = (left *= 100)  + right;   // 1000 + 11 = 1011
见:


另外,“ab”在您的RSA实现中意味着什么?

您应该考虑您得到的答案(27172352)和您正在执行的操作(mod 10403)。很明显,答案不可能正确,因为答案必须在0..10402范围内。这与数组无关。您真正关注的是如何解码十六进制字符串。您可以在此处和其他位置搜索答案。请注意,您正在调用
modExp()
字符串中的每个字符一次。您要做的是对字符串进行解码,并对结果调用
modExp
一次。是的,数组中第一个数字的答案是2717,第二个数字是2352,答案是27172352。这是我的问题的基础。@DwayneTowell我认为您误读了代码和/或解释。Th在输出端(272352)是组合的(串联的)两次计算的输出mod 10403。谢谢@dvnrrs,什么是十六进制字符串?谢谢你的帮助,我一定会读到十六进制,我如何让
returnVal
接受
char*
std::string
?只需更改它所用的参数,然后循环遍历所有字符并逐个处理它们如果您决定使用C字符串(
char*
),请记住传递length参数。对不起,我在“mathsy”处没有问题但是我真的很纠结于术语。哪一部分是参数,我该如何修改它?谢谢你的帮助,我知道我的愚蠢一定很令人沮丧!这是不是取代了原始函数?还是和原始函数一样好?再次感谢,我真的很欣赏它。关键是一次处理整个字符串并返回一个大字符串整数,而不是在一个字符块中处理它并返回一组整数。如果新函数可以做到这一点,您就不需要旧函数了。太棒了,谢谢!这可以应用于长度超过2个字母的事情吗?例如,如果要转换“abc”或“word”?它必须是某种形式的循环吗?我该怎么做?我认为“ab”是一个缩写,为了简单起见,可以是消息或加密密钥。如果我错了,请纠正我:)将“abc”转换为十进制101112?同样,你只需要“移位”通过在更大的乘法器上相乘得到额外的左十进制数:10*10000+11*100+12。您可以创建一个函数来转换此值,但跟踪int溢出。请阅读:)也许使用二进制数并使用内置的二进制移位“ab”会更好这只是一个随机输入。最终我希望它是一个完整的句子。这样做的有效方法是让s[n]乘以100^n,s[n-1]乘以100^[n-1]…s[1]*100,s[0]*100^0并将结果相加吗?
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 left  = returnVal('a');  // decimal 10
int right = returnVal('b');  // decimal 11

int result = (left *= 100)  + right;   // 1000 + 11 = 1011