《約瑟夫環(huán) 面向?qū)ο?c++》由會(huì)員分享,可在線閱讀,更多相關(guān)《約瑟夫環(huán) 面向?qū)ο?c++(5頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、約瑟夫環(huán)問題
一、 問題描述
約瑟夫環(huán)的問題:有n個(gè)人圍成一種圈,密碼為m,從第一種人開始報(bào)數(shù),報(bào)到m的出圈;接著從下一種人重新開始報(bào)數(shù)......如此循環(huán)直到所有人都出圈。
二、 實(shí)驗(yàn)代碼
Sea.h
#ifndef Sea_H
#define Sea_H
template
struct Node
{
DataType data;
Node*next;
};
template
class Sea
{
public:
Sea();
~Sea(){}
void De
2、h();
private:
Node*first;
int n, m;
};
#endif
Sea.cpp
#include
using namespace std;
#include"Sea.h"
template
Sea::Sea()
{
cin >> n; cin >> m; //輸入表長及密碼
//建立表長為n的循環(huán)鏈表
first = NULL; //初始化
Node
3、pe> *s, *q; s = NULL; q = NULL;
for (int i = 1; i <= n; i++)
{
s = new Node; //給n個(gè)人分別建立結(jié)點(diǎn),開辟結(jié)點(diǎn)空間
s->data = i;
s->next = NULL;
if (first == NULL)first = s; //類似于頭插法
else
q->next = s;
q = s;
}
s->next = first; //將終端結(jié)點(diǎn)的指針域指向頭指針
}
4、 // 出圈算法
template
void Sea::Deh()
{
Node *pre, *p;//工作指針pre,p,計(jì)數(shù)器count的初始化
pre = first;p = first->next;
int count = 2;
while (p != pre)
{
if (count == m)
{
pre->ne
5、xt = p->next;
cout << p->data <<" "; //輸出結(jié)點(diǎn)p的編號
delete p; p = pre->next;
count = 1;//計(jì)數(shù)器重新開始計(jì)數(shù)
}
else
{
pre = p;
p = p->next;
count++;
}
}
cout << p->data << " "; delete p;//輸出最后結(jié)點(diǎn)的號碼
}
Sea_main.cpp
#include
using namespace std;
#incl
6、ude"Sea.cpp"
void main() //主函數(shù)
{
Sea L;
L.Deh();
}
三、 程序錯(cuò)誤
1、上面的程序執(zhí)行后,將第m個(gè)人出圈。第一次是第m;第二次是下一種m-1個(gè)人;第三次下一種是m-1個(gè)人.....。
分析:導(dǎo)致這種問題的因素是由于在出圈后,這個(gè)出圈的書仍然被算計(jì)在內(nèi);
改正:在if語句中添加
。
2、浮現(xiàn)“讀取位置時(shí)發(fā)生訪問沖突”此類錯(cuò)誤;
分析:此類錯(cuò)誤的浮現(xiàn),一般都是初始化的問題;
解決:
Sea::Sea()
{
cin >> n; cin
7、 >> m; //輸入表長及密碼
//建立表長為n的循環(huán)鏈表
first = NULL; //初始化
Node *s, *q; s = NULL; q = NULL;
for (int i = 1; i <= n; i++)
{
s = new Node; //給n個(gè)人分別建立結(jié)點(diǎn),開辟結(jié)點(diǎn)空間
s->data = i;
s->next = NULL;
if (first == NULL)first = s; //類似于頭
8、插法
else
q->next = s;
q = s;
}
s->next = first; //將終端結(jié)點(diǎn)的指針域指向頭指針 ,添加了這個(gè)語句后,“讀取位置異?!边@個(gè)錯(cuò)誤就消失了。
}
3、運(yùn)營后浮現(xiàn)“無法查找或打開PDB文獻(xiàn)”問題;
解決:(1)?【調(diào)試】-->【選項(xiàng)和設(shè)立】
(2)?【常規(guī)】標(biāo)簽-->勾選“啟用資源服務(wù)器支持”,擬定
(3)忽視警報(bào),繼續(xù)。切換到【符號】標(biāo)簽,勾選“Microsoft 符號服務(wù)器”
(4)忽視安全警報(bào),【擬定】。至此,上述問題解決。
4、“程序運(yùn)營后,一閃就沒了”;
解決:調(diào)試時(shí),在主函數(shù)中增長語句:int m;cin >> m;
error LNK;
分析:此類錯(cuò)誤的產(chǎn)生因素有多種,我的文獻(xiàn)遇到這種錯(cuò)誤的因素是由于“反復(fù)定義了全局變量”。
四、 感想
在寫程序的過程中,多做多想,獨(dú)立思考,遇到問題如果是在解決不了的話,可以去百度。在百度的過程中你會(huì)發(fā)現(xiàn),許多錯(cuò)誤很典型。