約瑟夫問題——環形連結串列的基本使用操作;大整數加法——陣列的基本運用;
完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果:
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;
}