当出现“所有数字相同的多位数”时,如何让我的程序执行任何操作?

时间:2010-01-03 04:49:16

标签: c objective-c xcode

我的程序使用

生成最多6位数的随机数
int number = arc4random % 1000000;

我希望我的程序在出现66或4444或77777这样的数字时执行某些操作(多位数字,所有数字相同)。我可以手动写:

    switch (number) {
    case 11: blabla...;
    case 22: blabla...;
    (...)
    case 999999: blabla;
}

这将花费我很多程序代码。 (45例......)

有没有一种简单的方法可以解决问题。

10 个答案:

答案 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_rangedivisor在每次迭代时都被除以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)) 
              );

由于快捷方式的布尔运算,这应该是关于平均比较次数的足够好的解决方案,它每个数字最多只需要一个模运算,它没有循环,它可以很好地格式化为看起来对称,并且很明显它测试的是什么。但是,当然,过早的优化,你知道,但是因为已经有很多其他解决方案......;)