我的程序使用
生成最多6位数的随机数int number = arc4random % 1000000;
我希望我的程序在出现66或4444或77777这样的数字时执行某些操作(多位数字,所有数字相同)。我可以手动写:
switch (number) {
case 11: blabla...;
case 22: blabla...;
(...)
case 999999: blabla;
}
这将花费我很多程序代码。 (45例......)
有没有一种简单的方法可以解决问题。
答案 0 :(得分:7)
这是检查所有数字是否相同的一种方法:
bool AllDigitsIdentical(int number)
{
int lastDigit = number % 10;
number /= 10;
while(number > 0)
{
int digit = number % 10;
if(digit != lastDigit)
return false;
number /= 10;
}
return true;
}
答案 1 :(得分:2)
您可以计算出多少位数,然后将一个六位数字除以111111,5位数字除以11111等,然后查看结果是否为整数。
如果我不建议使用任何Objective-C代码,请不要使用该语言。
答案 2 :(得分:2)
只要你使用mod操作符(抱歉我不知道目标C)但我非常肯定必须有一个像%的mod操作符并根据1来修改它。
例如:
66%11
你知道它的位数是相同的,因为在这种情况下mod返回0。
同样在这里:
7777%1111
答案 3 :(得分:1)
你可以使用除法和乘法运算符递归地执行此操作(除了余数可以简化它)
e.g。
bool IsNumberValid(int number)
{
if(number > 10)
{
int newNumber = number / 10;
int difference = number - newNumber * 10;
number = newNumber;
do
{
newNumber = number / 10;
if((number - newNumber * 10) != difference)
{
// One of the number didn't match the first number, thus its valid
return true;
}
number = newNumber;
} while(number);
// all of the numbers were the same, thus its invalid
return false;
}
// number was <= 10, according to your specifications, this should be valid
return true;
}
答案 4 :(得分:1)
将数字转换为字符串,检查长度以获得数字位数,然后通过适当的数字修改。伪代码遵循num_to_check是你开始的数字(即777)
string my_num = (string)num_to_check;
int num_length = my_num.length;
int mod_result;
string mod_num = "1";
int mod_num_int;
for(int i = 1; i < num_length - 1; i++)
{
mod_num = mod_num + "1";
}
mod_num_int = (int)mod_num;
mod_result = num_to_check % mod_num_int;
//If mod_result == 0, the number was divisible by the appropriate 111... string with no remainder
答案 5 :(得分:1)
这是一个递归版本,仅适用于百灵鸟。同样,不是最有效的方式,但可能是最短的代码。
bool IsNumberValid (int number) {
if (number < 10) return true;
int n2 = number / 10;
// Check if the last 2 digits are same, and recurse in to check
// other digits:
return ((n2 % 10) == (number % 10)) && IsNumberValid (n2);
}
实际上,这是尾递归,所以一个不错的编译器应该生成非常有效的代码。
答案 6 :(得分:0)
转换为字符串并检查字符串中从位置1开始的每个字符是否与前一个字符相同。
答案 7 :(得分:0)
假设Objective-C有类似标准C99的'bool'类型:
#include <assert.h>
#include <stdbool.h>
extern bool all_same_digit(int number); // Should be in a header!
bool all_same_digit(int number)
{
static const struct
{
int lo_range;
int divisor;
} control[] =
{
{ 100000, 111111 },
{ 10000, 11111 },
{ 1000, 1111 },
{ 100, 111 },
{ 10, 11 },
};
static const int ncontrols = (sizeof(control)/sizeof(control[0]));
int i;
assert(number < 10 * control[0].lo_range);
for (i = 0; i < ncontrols; i++)
{
if (number > control[i].lo_range)
return(number % control[i].divisor == 0);
}
return(false);
}
您可以计算出一种变体,其中lo_range
和divisor
在每次迭代时都被除以10,从control[0]
中的值开始。
答案 8 :(得分:0)
#include <stdlib.h>
#include <stdio.h>
int main() {
int a = 1111;
printf("are_all_equal(%d) = %d\n",a,are_all_equal(a));
a = 143;
printf("are_all_equal(%d) = %d\n",a,are_all_equal(a));
a = 1;
printf("are_all_equal(%d) = %d\n",a,are_all_equal(a));
a = 101;
printf("are_all_equal(%d) = %d\n",a,are_all_equal(a));
return 0;
}
int are_all_equal(int what) {
int temp = what;
int remainder = -1;
int last_digit = -1;
while (temp > 0) {
temp = temp/10;
remainder = temp%10;
if (last_digit != -1 && remainder != 0) {
if (last_digit != remainder) return 0;
}
last_digit = remainder;
}
return 1;
}
类似,但不完全等于其他答案(我没有注意到那里)。
答案 9 :(得分:0)
digitsequal = ( ((number < 1000000) && (number > 111110) && (number % 111111 == 0)) ||
...
((number < 1000) && (number > 110) && (number % 111 == 0)) ||
((number < 100) && (number > 10) && (number % 11 == 0))
);
由于快捷方式的布尔运算,这应该是关于平均比较次数的足够好的解决方案,它每个数字最多只需要一个模运算,它没有循环,它可以很好地格式化为看起来对称,并且很明显它测试的是什么。但是,当然,过早的优化,你知道,但是因为已经有很多其他解决方案......;)