如何查找包含序列666的数字?

时间:2010-08-19 21:21:02

标签: c++

不是家庭作业问题,我们还在学校学习循环 遇到编程挑战...... 的开始 数字666被认为是神秘的“野兽数” 并且是所有主要启示录主题大片电影中使用良好的数字。然而 数字666不能总是在脚本中使用,因此使用诸如1666之类的数字。让我们把至少包含三个连续六个的数字称为野兽 数字。前几个兽数是666,1666,2666, 3666,4666,5666 ......

鉴于基于1的索引n,我的程序应该返回n兽号。

定义

  • 分类:ApocalypseSomeday
  • 方法:getNth
    • 参数:int
    • 返回:int
    • 方法签名:int getNth(int n)(确保您的方法是公开的)

约束

  • n将介于110000之间,包括

实施例

  1. 2返回:1666
  2. 3返回:2666
  3. 6返回:5666
  4. 187返回:66666
  5. 500返回:166699
  6. 老师不是问题。我在编程挑战C ++中找到了它。我到目前为止的进展

    public class ApocalypseSomeday
    {
      public int getNth(int n)
      {
           int i = 0, j = 0,k = 0;
           int s = 1,c = 1;
           int r = 666;
           while (s < n)
           {
                k = 0;
                while ((c % 10000) == 6666 && s < n && k < 10000)
                {
                    r = c * 10000 - 6000 + k;
                    k++;
                    s++;
                }
    

3 个答案:

答案 0 :(得分:1)

由于没有提到性能限制并且输入的大小非常小,最简单的选择是使用暴力:从1开始计数并检查每个数字以查看它是否包含666.当您找到{{1这样的数字,返回你找到的最后一个。

检查数字是否包含666的最简单(但很慢)的方法是将其转换为字符串并搜索子字符串'666'。同样,由于输入的大小有限且缺乏性能限制,这应该足够了。

使用算术运算进行此检查可能更快。在Python中你可以这样做:

n

如果您需要尽可能快地执行程序,则可以预先计算n的每个可能值的答案,并将答案硬编码到程序中。然后,您可以通过简单的索引操作找到任何n的结果。

答案 1 :(得分:0)

public class ApocalypseSomeday {
     public int getNth(int n) {
          int i = 0, j = 0,k = 0;
          int s = 1,c = 1;
          int r = 666;
          while (s < n) {
               k = 0;
               while ((c % 10000) == 6666 && s < n && k < 10000) {
                   r = c * 10000 - 6000 + k;
                   k++;
                   s++;
               }
               if (s == n) return r;
               if (k == 10000) {
                   c++;
                   continue;
               }
               k = 0;
               while ((c % 1000) == 666 && s < n && k < 1000) {
                   r = c * 1000 + k;
                   k++;
                   s++;
               }
               if (s == n) return r;
               if (k == 1000) {
                   c++;
                   continue;
               }
               k = 0;
               while ((c % 100) == 66 && s < n && k < 100) {
                   r = c * 1000 + 600 + k;
                   k++;
                   s++;
               }
               if (s == n) return r;
               if (k == 100) {
                   c++;
                   continue;
               }
               k = 0;
               while ((c % 10) == 6 && s < n && k < 10) {
                   r = c * 1000 + 660 + k;
                   k++;
                   s++;
               }
               if (s == n) return r;
               if (k == 10) {
                   c++;
                   continue;
               }
               r = c * 1000 + 666;
               c++;
               s++;
          }
          return r;
     }
}

答案 2 :(得分:0)

class ApocalypseSomeday
{
public:
int getNth(int n)
{
    int cpt = 0;
    int nbr = 666;
    while (cpt != n)
    {
        if (((nbr % 1000) == 666) )
        {
            //printf("nb[%d]:%d\n", cpt, nbr);
            cpt++;
            nbr++;
            continue;
        }
        if ((nbr % 10000) - (nbr % 10) == 6660)
        {
            //printf("nb[%d]:%d\n", cpt, nbr);
            cpt++;
            nbr++;
            continue;
        }
        if ((nbr % 100000) - (nbr % 100) == 66600)
        {
            //printf("nb[%d]:%d\n", cpt, nbr);
            cpt++;
            nbr++;
            continue;
        }
        nbr++;
    }
    return nbr-1;
}

};