C++ 如何将数字包装成一个范围?
我有一个程序,它接受字符串中的每个字符。向其添加一个数字x(x每次添加到字符时都会增加)。我需要新字符(c+x)在[32126]范围内 我知道使用%126来保持c+x32,并且这些数字在该范围内“环绕”吗 以下是我的代码:C++ 如何将数字包装成一个范围?,c++,C++,我有一个程序,它接受字符串中的每个字符。向其添加一个数字x(x每次添加到字符时都会增加)。我需要新字符(c+x)在[32126]范围内 我知道使用%126来保持c+x32,并且这些数字在该范围内“环绕”吗 以下是我的代码: string a; unsigned int x = 1; cin >> a; for (auto &c : a) { if (c <= 126 && c >= 32)
string a;
unsigned int x = 1;
cin >> a;
for (auto &c : a)
{
if (c <= 126 && c >= 32)
{
if (c + x > 126) //checking if c needs to be wrapped
{
c = (c + x) % (126); //wrapping c? <-- this is the problem
}
else
{
c += x;
}
if (x == 256)
{
x = 1;
}
else
{
x++;
}
}
cout << c;
}
}
我意识到我已经试过了,但是用32而不是31,这意味着它将排除在32的包装中 由于
%
运算符允许您获取[0;限制)
空间,因此当您需要[start;limit)
空间时,标准方法是通过%
运算符获取空间[0;limit-start]
,然后将其添加到开始中。这样您将获得[start;limit)
空格。因此公式为
numberToBeWrapped=start+(numberToBeWrapped-start)%(limit-start)
或者,在您的情况下:
c=32+(c+x-32)%(126-32);
由于%
运算符允许您获取[0;限制)
空间,当您需要[start;limit)
空间时,标准方法是获取空间[0;limit-start]
通过%
运算符,然后将其添加到开始
。这样您将获得[开始;限制)
空间。因此公式为
numberToBeWrapped=start+(numberToBeWrapped-start)%(limit-start)
或者,在您的情况下:
c=32+(c+x-32)%(126-32);
您是否丢失了代码顶部的int main()
(以及一些#include
指令),或者这是一个更大的片段?(我不想编辑为“正确”)如果不止这些。您的编辑看起来好像没有使用正确的公式。因为数字应该在32到126之间(包括两个结束值),您需要进行模运算(126-32+1=95)。如图所示,您可以得到31(如果c+x是126的倍数),或者可以得到156(如果c+x%126是125)。两者都不符合您设定的标准。答案更准确。您是否丢失了代码顶部的int main()
(以及一些#include
指令),或者这是更大的部分?(我不想编辑为“更正”)如果不止这些。您的编辑看起来好像没有使用正确的公式。因为数字应该在32到126之间(包括两个结束值),您需要进行模运算(126-32+1=95)。如图所示,您可以得到31(如果c+x是126的倍数),或者可以得到156(如果c+x%126是125)。两者都不符合您设定的标准。答案更精确。由于某些原因,结果不正确。输入“abcdefghijklmnopqrstuvwxyz”应变为“bdfhjlnrprvxz | ~!#%)+-/1”@TimothyColemanHarrelson,是的,很抱歉,有一个错误:你还应该从numberToBeWrapped
中减去start
。我为你的案例修正了公式和代码。我明白了,开始时的数字必须是start-1,否则它会将起始数字排除在外。@TimothyColemanHarrelson,我很高兴,这一点您找到了一种方法使其工作:)注意:我刚刚注意到,您使用%126
而不是%127
%126
将为您提供范围[0;125]
(不包括126)。出于某种原因,这并没有给我正确的结果。输入“abcdefghjjjklmnopqrstuvwxyz”应该变成“bdfhjlnrprtvxz~!”+/1”@TimothyColemanHarrelson,是的,很抱歉,有一个错误:你还应该从numberToBeWrapped
中减去start
。我为你的案例修正了公式和代码。我明白了,开始时的数字必须是start-1,否则它会将起始数字排除在外。@TimothyColemanHarrelson,我很高兴,这一点你找到了一种方法:)注意:我刚刚注意到,你使用%126
而不是%127
,%126
将为你提供范围[0;125]
(126不包括在内)。
c = 31 + (c + x) % (126);