1. 程式人生 > >約瑟夫問題——環形連結串列的基本使用操作;大整數加法——陣列的基本運用;

約瑟夫問題——環形連結串列的基本使用操作;大整數加法——陣列的基本運用;

完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果:

1.約瑟夫問題

描述:有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下一隻猴子時,這個猴子就是猴王,程式設計求輸入n,m後,輸出最後猴王的編號。

輸入:輸入包含兩個整數,第一個是n,第二個是m (0 < m,n <=300)。

輸出:輸出包含一行,即最後猴王的編號。

#include <cstdio>

#include <cmath>

#include <algorithm>

#include <iostream>

using namespace std;

struct node

{

    int data;

    node *next;

};

int main()

{

    int n,m;

    while(cin >> n >> m && n)

    {

    node *first;

    node *p,*q;

    first = new node;

    first->data = 1;

    first->next = first;

    if(m != 1){

    for(int i = n;i >= 2;i--){  //倒序插入n個數據

        p = new node;

        p->data = i;

        p->next = first->next;

        first->next = p;

    }

    q = first;

    while(q->next != q){  //刪除第'm'個元素

        n = m - 1;

        while(n--){

            q = q->next;

        }

        p = q->next;

        q->next = p->next;

        delete p;

        q = q->next;

    }

    cout << q->data << endl;

    }

    else

        cout << n << endl;

    while(first->next != first){  //清空連結串列

        q = first;

        first = first->next;

        delete q;

    }

    delete first;

    }

}

2.大整數加法

描述:求兩個不超過200位的非負整數的和。

輸入:有兩行,每行是一個不超過200位的非負整數,可能有多餘的前導0。

輸出:一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。

#include <cstdio>

#include <cmath>

#include <algorithm>

#include <iostream>

#include <cstring>

#include <string>

#include <stack>

#include <queue>

using namespace std;

char a[205], b[205];

int c[205], d[205];

long long sum;

int he;

int main()

{

      scanf("%s %s", a + 1, b + 1);

      int lena = strlen(a + 1);

      int lenb = strlen(b + 1);

      int MaxLen = max(lena, lenb);

      he = 0;

      queue <int> cc;

      for(int i = 1;i <= lena;i++){

        c[lena - i + 1] = a[i] - '0';

      //    cout << a[i];

      }

      //cout << endl;

      for(int i = 1;i <= lenb;i++){

        d[lenb - i + 1] = b[i] - '0';

      //    cout << b[i];

      }

      //cout << endl;

      for(int k = 1;k <= MaxLen;k++){

        he = c[k] + d[k];

        if(he > 9){

            c[k + 1] += (he / 10);

            he = he % 10;

        }

        cc.push(he);

      }

      int e = 1;

      while(!cc.empty())

      {

        int y = cc.front();

        sum += (y * e);

        e *= 10;

        cc.pop();

      }

      cout << sum << endl;

      return 0;

}