1

所以我有一个四位数的数字,这是我正在制作的一个简单谜题中的玩家输入,我希望能够检查每个数字,比如说我想检查右边的第二个数字,如果数字恰好是 4601 那么当然会是 6,但除了测试每个四位数之外,它们是不是更快的方法?我通过搜索找到了一些结果,但它们没有帮助,它们只是让我更加困惑,请说出任何答案,以便任何人都能理解。我也在使用c++。

4

3 回答 3

4

要从任意整数中检索第二个最重要的(以十为基数)数字,i您可以执行以下操作:

while (i >= 100)
    i /= 10;
return i % 10;

当然,这假设数字大于或等于 10 开始。如果您需要保留该号码,那么您将(显然)希望对副本进行操作。

编辑:

可以定义一个函数来使用算术或字符串操作提取任意数字。

算术解决方案:

int extractDigit(size_t digit, int n) {
    int mask = 1;
    while ( digit --> 0 )
        mask *= 10;
    if (n < mask / 10) { // insufficient digits
        return -1; // or some other appropriate error handling.
    while ( n >= mask )
        n /= mask;
    return n % 10;
}

字符串解决方案:

#include <sstream>
#include <string>
using std::string;
using std::stringstream;

int extractDigit(size_t digit, int n) {
    string result = static_cast<stringstream&>(stringstream() << n).str();
    if (result.size() < digit) {
        return -1;
    }
    return result[digit-1] - '0';
}

这两种解决方案都隐含地假设n它将是非负的。如果需要,您可以通过使用无符号数据类型来强制执行此前提条件。此外,这两个函数都定义了数字位置,使得最高有效位在位置 1,并且位置向右增加。

于 2012-11-12T05:08:11.267 回答
1

我不会猜测你在拥有数字后要做什么。但如果它只是你想要的数字,那么你可以在下面使用:

int a=1234;
char b[4];
sprintf(b,"%d",a);
char c=b[1];

现在c有您的 4 位数号码的第二位数。同样,您可以使用字符数组的索引访问所有数字b

对于 c++ 等价物,请参见下文:

  std::ostringstream out;
  out << age;

现在out.str()[1]将显示第二个数字。

于 2012-11-12T05:25:17.693 回答
0

您可以将数字读取为 anint并将其转换为char数组并将每个字符检查为数字

例子:

char digits[5];
int number;
//Read number in
scanf("%d",&number);
//Make sure it's 4 digits
number%=10000;
//Convert it to a char array
sprintf(digits,"%d",number)

if(digits[1]=='6')
{
    //do stuff
}
于 2012-11-12T05:05:21.773 回答