如何在不使用数组的情况下检查整数中相同的数字?

时间:2016-11-02 16:08:20

标签: c recursion

我正在尝试编写一个简单的C程序,它可以生成3个案例中的一个:

  1. 没有相邻数字的整数。
  2. 具有一对相同相邻数字的整数。
  3. 具有相同相邻数字的单个三重奏的整数。
  4. 在整数值不满足任何一种情况的要求后,整数将增加1,然后再次检查。

    条件:用户输入1-3之间的选项,起始整数值为非负整数,生成的值大于用户输入的起始整数值。

    注意:我可能不会使用涉及数组或字符串的方法。允许递归,但我的教授不鼓励使用它。

    我目前的问题是确定如何比较输入的整数值中的数字而不为每个数字创建新变量。这是我到目前为止所做的:

    int getOption()  //retrieves the option entered by the user
    {
      int option;
      do
      {
        printf("\nEnter desired option: ");
        scanf("%d", &option);
        if (option <= 0 || option > 3)
        {
          printf("\nError! Invalid option selected!!\n");
        }
      }while(option <= 0 || option > 3);
      return(option);
    }
    
    int getStart() //retrieves the starting integer value entered by the user
    {
      int startValue;
      do
      {
        printf("\nEnter starting integer: ");
        scanf("%d", &startValue);
        if (startValue <= 0)
        {
          printf("\nError! Non-negative values only!!\n");
        }
      }while(startValue <= 0);
      return(startValue);
    }
    
    int checkSame(int startValue);  //checks if the user-given integer has any pairs of same adjecent digits.
    {
     int counter;
     int sameAdjacent = 0;
     while (sameAdjacent < 1)
     {
       while(startValue > 0)
       {
         startValue = startValue % 10;
         counter++;
       }
       for(startValue; startValue > 0; startValue / 10)
       {
         //?????
    
       }
    
    
      }
     }
    

    以下是一些正确执行的示例:

    1. No adjacent digits the same.
    2. A single pair of adjacent digits the same.
    3. A single trio of adjacent digits the same.
    Enter desired option: 1
    Enter starting integer: 1222
    Next larger value with no two adjacent digits the same is 1230.
    
    1. No adjacent digits the same.
    2. A single pair of adjacent digits the same.
    3. A single trio of adjacent digits the same.
    Enter desired option: 2
    Enter starting integer: 133300
    Next larger value with only a single pair of digits the same is 133401.
    
    1. No adjacent digits the same.
    2. A single pair of adjacent digits the same.
    3. A single trio of adjacent digits the same.
    Enter desired option: 3
    Enter starting integer: 123456
    Next larger value with only a single trio of digits the same is 123555.
    

    感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

由于这是一项你可能想要自己解决的任务,让我给你一个提示,让你走上正确的轨道:

  • 如果x是整数变量,则:
    • x % 10为您提供x的最后一位10位数字和
    • x = x / 10剁掉x的最后一位数。

另请注意,您可以在切断之前将x的最后一位数保存在另一个变量中。实际上,您可以通过这种方式轻松保存两个(或更多!)最近切断的数字,只需为每个数字保留一个变量。

如果这不是一个充分的提示,请告诉我你仍然陷入困境的地方,我会尝试提供更多帮助。

好的,既然你说你仍然被卡住了,那就让我告诉你我是如何解决这个问题的:

int pairs = 0, triples = 0;
int digit1 = -1, digit2 = -1, digit3 = -1;  // no actual digit can be -1

while (x > 0) {
    // keep track of the last three digits chopped off
    digit3 = digit2;
    digit2 = digit1;
    digit1 = x % 10;

    // chop off the last digit of x
    x /= 10;

    // check whether we've just chopped off a pair or a triple
    if (digit1 == digit2) {
        pairs++;
        if (digit2 == digit3) {
            triples++;
        }
    }

    // uncomment these lines for debugging output:
    // fprintf(stderr, "x = %d, digit(1-3) = %d, %d, %d; %d pairs and %d triples seen\n",
    //         x, digit1, digit2, digit3, pairs, triples);
}

作为练习,您可能希望为x的各种值运行此代码,并在调试器中逐步执行循环(建议!)或取消注释fprintf()调用以查看变量在每次迭代时都会发生变化。

一旦你完成了这项工作,我相信你应该能够轻松填写其余的任务。

答案 1 :(得分:0)

对于它的值,如果用户给定的整数恰好有1对相同的相邻数字,则以下方法将返回1(true),否则返回0(false):

 public int checkSame(int startValue)
 {
    int sameAdjacent = 0;
    int last,pre_last;
    while(startValue > 0)
    {
        last = startValue % 10;
        pre_last = (startValue / 10) % 10;
        if(last == pre_last)
            sameAdjacent++;
        startValue/=10;
    }
    return sameAdjacent == 1 ? 1 : 0;
}