我想检查整数是否包含其中的特定数字,即假设我们有数字 134、340、3450,我们如何检查数字是否包含 34。如果我们将数字存储为字符串,这种情况是微不足道的,但是当我们将它们存储为数组整数时是否可以这样做?
我最初的想法是,我们可能不得不使用倍数为 10 的 Modulo 运算符!
snprintf
将int
转换为字符串,然后strstr
检查是否存在。沿着这条线的东西:
char buffer[20] = "";
int n = 3450;
snprintf( buffer, 20, "%d", n );
printf( "%sn", strstr( buffer, "34" ) ? "present" : "not present" );
这是一个纯粹的二进制解决方案(不转换为字符串)。注意:仅限无符号值。
int main(int argc, char *argv[])
{
std::vector<unsigned long> nums = { 3450, 1233, 3, 34, 3534, 10003400, 0 };
const unsigned long pattern = 34;
unsigned long mod = 10; //power of 10 that will isolate the pattern number of digits
while ((pattern % mod) != pattern) mod *= 10;
//test all of the numbers in the vector
for (const auto& num : nums) {
auto test = num; //copy so we can mutate it.
for (; (test % mod) != pattern && test > mod; test /= 10);
if ((test % mod) == pattern)
std::cout << num << " contains " << pattern << 'n';
}
return 0;
}
显示:
3450 contains 34
34 contains 34
3534 contains 34
10003400 contains 34
你最初的想法是朝着正确的方向前进。第一步是计算要定位的数字中的数字。数字"34"有两位数,因此模块是 10 的 2 次方,即 100。如果数字只有一个数字,则模块为 10。如果数字有三位数字,则模块为 1000。等等。
然后,这变成了一个问题:
-
从要搜索的整数开始。
-
取整数的余数除以模数。
-
如果它等于您要搜索的数字,则您已完成。
否则,将 整数除以 10,然后返回到步骤 2,但在整数值达到 0(未找到)时停止。
如何计算原始模数将是你的家庭作业。
一种方法是将整数转换为字符串。下面是一个示例。请注意,此方法需要 C++11,因此请确保正确设置编译器。
#include <iostream>
#include <string>
using namespace std;
int main(){
int num1 = 134;
int num2 = 320;
string temp = to_string(num1);
if (temp.find("34") != -1){
cout << "34 is in this integer!n";
}
else {
cout << "34 isn't in this integer.n";
}
temp = to_string(num2);
if (temp.find("34") != -1){
cout << "34 is in this integer!n";
}
else {
cout << "34 isn't in this integer.n";
}
return 0;
}
输出:34 在这个整数中!34 不在此整数中。
另一个非字符串版本:
#include <math.h>
#include <stdio.h>
int main()
{
int number1;
int number2;
printf("input number1: ");
scanf("%d", &number1);
printf("input number2: ");
scanf("%d", &number2);
int divisor = pow(10, (int)(log10(number1)) + 1);
printf("divisor: %dn", divisor);
while (number2) {
if ((number2 - number1) % divisor == 0) {
printf("Yesn");
return 0;
}
number2 /= 10;
}
printf("Non");
return 0;
}
使用 gcc test.c -o test -lm
构建,并测试:
test git:(master) ✗ ./test
input number1: 34
input number2: 1343403450
Yes
test git:(master) ✗ ./test
input number1: 35
input number2: 1343403450
No
(next_stock) ➜ test git:(master) ✗