如何检查整数变量中是否包含特定数字

6

如何检查int变量是否包含特定数字

我找不到解决方案。例如:我需要检查int 457中是否包含数字5。

谢谢您的帮助 ;)


int457 并不真正“包含”数字 5。它的十进制表示包含了该数字。 - Keith Thompson
3个回答

15
457 % 10 = 7    *

457 / 10 = 45

 45 % 10 = 5    *

 45 / 10 = 4

  4 % 10 = 4    *

  4 / 10 = 0    done

理解了吗?

这是一个C语言实现的算法,可以找到任何整数中的任何数字。它基本上与Shakti Singh的答案完全相同,只是它适用于负整数,并且一旦找到数字就会停止...

const int NUMBER = 457;         // This can be any integer
const int DIGIT_TO_FIND = 5;    // This can be any digit

int thisNumber = NUMBER >= 0 ? NUMBER : -NUMBER;    // ?: => Conditional Operator
int thisDigit;

while (thisNumber != 0)
{
    thisDigit = thisNumber % 10;    // Always equal to the last digit of thisNumber
    thisNumber = thisNumber / 10;   // Always equal to thisNumber with the last digit
                                    // chopped off, or 0 if thisNumber is less than 10
    if (thisDigit == DIGIT_TO_FIND)
    {
        printf("%d contains digit %d", NUMBER, DIGIT_TO_FIND);
        break;
    }
}

1
很酷!如果您对我的帮助感到满意,请点击勾选将其标记为您选择的答案。祝编程愉快! - matt.dolfin
嘿,感谢你的回答,但我不明白为什么要使用模数10。这种问题是否有任何规则、关系可以解决,也许我们需要使用5*2之类的方法呢?请解释一下为什么要使用10,谢谢。 - black sensei
是的,现在它非常清晰了。就像从右到左逐个消除数字一样。考虑仅考虑模除%10的自然部分,并找出它们的%5除法是否为0以确保呢?谢谢。 - black sensei
@black:我不认为我理解你的建议。考虑一下,如果原始问题陈述为“检查整数457是否包含数字7”或“检查整数407是否包含数字5”,你会如何解决这些问题?我猜测你考虑的算法对于这些情况可能不起作用。但是就像我说的那样,我不认为我理解你的意思。 - matt.dolfin
@black:请查看我回答的编辑。我希望这能回答你可能仍然有的任何问题。如果你还是感到困惑,最好查一下模运算和整数除法操作的工作原理。祝编程愉快! - matt.dolfin
显示剩余2条评论

4
将其转换为字符串,并检查该字符串是否包含字符“5”。

它使用类似于模数循环的算法,@matt.dolfin..那么,为什么要构建字符串呢? :) - akira
对于有成千上万位的整数来说,这可能更快。% 运算符代价高昂。 - Marcus Johansson
@Marcus Johansson:为了将数字转换为字符串,您需要使用与@matt.dolfin或@Shakti Singh指出的类似算法。此外,还需要一些开销来创建字符串,再加上一些开销来在创建的字符串中进行字符串搜索。 - akira
只是为了证明“转换为字符串并查找”不是解决问题的最佳方案,可以参考以下链接:http://tinodidriksen.com/2010/02/07/cpp-convert-int-to-string-speed/,其中提供了将数字转换为字符串的代码:http://tinodidriksen.com/uploads/code/cpp/speed-convert-int-to-string.cpp。 - akira
@akira:我完全同意这不是最有效的解决方案。但是,根据使用场景,额外的开销可能微不足道。优点是代码更易读,出错几率更小(当然,这是个人观点)。通常我会先选择“更清晰”的解决方案,然后再进行优化。另一方面,如果你不仔细考虑代码的使用方式,字符串操作可能非常昂贵。 - Yhrn

4
int i=457, n=0;

while (i>0)
{
 n=i%10;
 i=i/10;
 if (n == 5)
 {
   printf("5 is there in the number %d",i);
 }
}

printf(" .. ") .. 双引号是C语言用于字符串的符号,而不是单引号... 或许使用abs(i)会更好。 - akira
通常我会提供一个函数,在未命中时返回0,在命中时返回1;然后只需使用 while (i != 0),这样它也可以处理负数。 - akira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接