湘中三水又吧 关注:5贴子:697
  • 12回复贴,共1
这里记录一些学过的零碎算法。标题说闲杂并不是因为这些算法不重要,主要是不想开太多帖子。


1楼2017-11-27 10:16回复
    厄拉多塞筛
    #define NUM 100
    bool num[NUM];
    void Prime()
    {
     for (int i = 2; i < NUM; ++i) num[i] = true;
     for (int i = 2; i < NUM; ++i)
      {
        if (num[i])
        {
          for (int j = 2; j*i < NUM; ++j) num[j*i] = false;
        }
      }
      for (int i = 2; i < NUM; ++i) if (num[i])cout << i << endl;
    }


    2楼2017-11-27 11:00
    回复
      厄拉多塞筛是用来求某一范围的所有素数。一般的,判断n是否为素数,会写成遍历检测2到根号n是否为其因数。实际上,这么做有冗余判断,因为本只需遍历2到根号n之间的素数就行了。但为了判断一个n是否为素数,而求出小于根号n的所有素数又有点得不偿失。但如果这些素数本来就是要求的呢--求某一范围的所有素数。这就是厄拉多塞筛性能高的原因了。
      值得一提的是,最初我想把代码写成如下。上面是借鉴了网上的代码。对比两份代码,可以发现上面的代码写得很漂亮。下面的代码引入了%,这是比较耗性能的运算。最重要的是,下面代码的内循环遍历的数据明显比上面多。两份代码的思想不一样,上面的代码是把不符合条件的数据直接告诉你,而下面的代码是要你一个个判断哪些数据不符合条件。
      for (int i = 2; i < NUM; ++i)
      {
        if (num[i])
       {
          for (int j = i + 1; j < NUM; ++j)
          {
            if (0 == j%i) num[j] = false;
          }
        }
      }


      3楼2017-11-27 21:48
      回复
        秦九韶算法
        int Polynomial(int a[],int n,int x)
        {
         int sum = 0;
         for (int i = n-1; i >=0; --i)
          {
            sum = sum * x + a[i];
         }
         return sum;
        }


        4楼2017-11-27 22:31
        收起回复
          快速幂
          递归版本
          int Pow(int x, int n)
          {
            int res;
            if (0 == n) return 1;
            res = Pow(x, n / 2);
            if ((n&1) == 0) return res*res;
            else return res*res*x;
          }
          非递归版本
          int Pow(int x, int n)
          {
            int temp = 1;
            while (n > 0)
            {
              if ((n & 1) == 1) temp *= x;
              x *= x;
              n >>= 1;
            }
            return temp;
          }


          5楼2017-11-28 00:08
          收起回复
            递归渐降解析
            int Exp(string& exp, int& p);
            int GetActor(string& exp, int& p)
            {
              int actor = 0;
              if (exp[p] == '(')
              {
              p++;
              actor = Exp(exp, p);
               ++p;
               return actor;
             }
              while (exp[p]!='\0'&&(isdigit(exp[p])))
              {
               actor = actor * 10 + exp[p++] - '0';
              }
              return actor;
            }
            int MulDiv(string& exp, int& p)
            {
              int v1 = GetActor(exp, p);
              char ch = exp[p];
              while ('*'==ch ||'/'==ch)
             {
               p++;
              int v2 = GetActor(exp, p);
               if ('*' == ch) v1 *= v2;
              else v1 /= v2;
               ch = exp[p];
             }
              return v1;
            }
            int Exp(string& exp, int& p)
            {
              int v1 = MulDiv(exp, p);
             char ch = exp[p];
              while ('+' == ch || '-' == ch)
              {
               p++;
               int v2 = MulDiv(exp, p);
               if ('+' == ch) v1 += v2;
               else v1 -= v2;
               ch = exp[p];
              }
             return v1;
            }


            6楼2017-12-05 16:30
            收起回复
              Floyd判圈算法
              struct Node
              {
               Node() { next = NULL; }
                Node* next;
              };
              Node* IsRing(Node* head)
              {
                Node* slow = head;
               Node* quick = head;
                while (quick != NULL&&quick->next!=NULL)
                {
                  slow = slow->next;
                  quick = quick->next->next;
                  if (slow == quick) return slow;
                }
                return NULL;
              }
              int RingLen(Node* node)
              {
               int len = 1;
                Node* p = node->next;
                while (p!=node)
               {
                  p = p->next;
                 ++len;
                }
               return len;
              }
              Node* RingStart(Node* head,Node* node)
              {
               while (head != node)
                {
                  head=head->next;
                 node = node->next;
                }
               return head;
              }


              7楼2017-12-05 17:01
              收起回复
                最长上升子序列
                void DealSeq(int seq[], int& n, int a[],int pos,int record[])
                {
                 if (0 == n|| a[seq[n - 1]] < a[pos])
                  {
                    record[pos] = seq[n - 1];
                    seq[n++] = pos;
                    return;
                  }
                 int s = 0, e = n;
                  while (s +1< e)
                 {
                    int mid = (s + e) / 2;
                    if (a[seq[mid]] == a[pos]) return;
                   if (a[seq[mid]] < a[pos]) s = mid;
                    else e = mid;
                  }
                  if (a[seq[s]] < a[pos])
                 {
                    seq[s + 1] = pos;
                    record[pos] = seq[s];
                  }
                  else
                  {
                    seq[s] = pos;
                    record[pos] = seq[s-1];
                  }
                }


                9楼2017-12-06 20:50
                回复
                  九宫格
                  int a[9][9] = {
                  {5,0,0,0,9,0,2,0,1},
                     {0,0,2,0,0,7,0,0,8},
                      {0,8,0,0,0,0,3,0,0},
                      {0,1,4,0,0,5,0,0,0},
                      {0,0,0,9,0,3,0,0,0},
                      {0,0,0,8,0,0,9,4,0},
                      {0,0,3,0,0,0,0,6,0},
                      {6,0,0,2,0,0,1,0,0},
                      {8,0,9,0,6,0,0,0,5},
                  };
                  int cnt = 0;
                  void Check(int ok[],int k)
                  {
                   for (int i = 1; i <= 9; ++i)ok[i] = true;
                    int row = k / 9;
                    int col = k % 9;
                    for (int i = 0; i < 9; ++i)
                    {
                      ok[a[i][col]] = false;
                      ok[a[row][i]] = false;
                    }
                   for (int i = row/3*3; i < row / 3*3 + 3; ++i)
                    {
                      for (int j = col/3*3; j < col / 3*3 + 3; ++j)
                      {
                        ok[a[i][j]] = false;
                      }
                    }
                  }
                  void f(int k)
                  {
                    if (81 == k)
                    {
                      if (cnt > 2) return;
                      ++cnt;
                      for (int i = 0; i < 9; ++i)
                      {
                        for (int j = 0; j < 9; ++j)
                        {
                          cout << a[i][j] << " ";
                        }
                        cout << endl;
                      }
                     cout << endl;
                      return;
                    }
                   int row = k / 9;
                    int col = k % 9;
                   if (a[row][col]>0)
                    {
                      f(k + 1);
                    }
                    else
                   {
                      int ok[10];
                      Check(ok, k);
                      for (int i = 1; i <= 9; ++i)
                      {
                        if (ok[i])
                       {
                         a[row][col] = i;
                          f(k + 1);
                          a[row][col] = 0;
                        }
                      }
                    }
                  }


                  10楼2017-12-07 18:51
                  回复