锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Is it a mistake in TAOCP 瑕佽鐨勮瘽濂藉錛屽垪涓彁綰插厛
Maggie McLoughlin <mam@theory.stanford.edu> to Windreamer
to deal with empty sets and strings etc in a meaningful way.
If n = 0 and you're supposed to do something for 1 <= j <= n,
you don't have to do anything.
Thanks for your interest in my book! -- Don Knuth
鍛靛懙錛屽師鏉ユ槸鎴戝勾灝戞棤鐭ヤ簡錛屽啀嬈¤禐涓涓婯nuth鐖風埛鍐欎功鐨勭簿鑷?img src ="http://m.shnenglu.com/windreamer/aggbug/1814.html" width = "1" height = "1" />![]()
銆奣he Art of Computer Programming銆?/STRONG>鐨勭涓鍗?澶х悊鐭寵姳綰圭殑灝佺毊,鎷垮湪鎵嬮噷娌夌敻鐢哥殑,榪欓儴涔︾粰鎴戠殑絎竴鍗拌薄灝辨槸榪欐牱--"鍘氶噸"--甯︽湁鐫紲炵鎰熷拰鍘嗗彶鎰熴?BR>
鍏跺疄榪欓儴涔︾殑涓枃鐗堝墠璦,鎴戞棭灝辨湁騫告嫓璇昏繃,涓嶈繃鍜岃嫳鏂囧師鏂囩浉姣旇緝,鍦ㄤ腑鏂囩炕璇戠殑鍛抽亾鐪熺殑鏄樊浜嗗緢澶氾紝鎴戣寰楀彧鏈夎鍘熸枃鎵嶈兘鎰熷埌Knuth鐣ュ甫璇欒皭鐨勮屽張鍚屾槸涓嶆槸涓ヨ皚鐨勯鏍鹼紝浠栧啓鏂囩珷鐨勯鏍煎叾瀹炵湡鐨勬尯澶╅┈琛岀┖鐨勶紝浠庡啓紼嬪簭鎵埌鍋氶キ錛屼粠綆楁硶榪欎釜璇嶈亰璧鳳紝榪界潃榪欎釜璇嶇殑鏉ュ巻錛岀珶鐒惰繕甯﹀嚭浜嗚幈甯冨凹鑼紵鐪熸檿錛屽紑鍙ョ帺絎戯紝Knuth緇濆鏄偅縐嶈侀〗绔ュ瀷鐨勪漢鐗╋紝浠栬繖鏈功杈懼埌濡傛鍘氬害浼拌姝ょ被"搴熻瘽"鍔熶笉鍙病銆?BR>
浠嶢lgorithm鍒癊uclid's Algorithm涔熷氨鏄垜浠啛鎮(zhèn)夌殑杈楄漿鐩擱櫎姹傛渶澶у叕綰︽暟娉曪紝鎴戣繖涓畻娉曞皬鐧藉紑濮嬭繘鍏ヤ簡浠栨墦寮鐨勭畻娉曚笘鐣?.....
Knuth琛屾枃寰堝枩嬈㈡瘮杈冦佹瘮鍠匯佸姣旓紝榪欒璇昏呯湅璧鋒潵寰堣交鏉炬剦鎮(zhèn)︼紝涓嶈繃褰撲粬鐪熺殑鐜╄搗鏁板鏉ワ紝鎴戝氨鏈夌偣鍚冧笉娑堜簡錛屾渶鍚庨潰瀵圭畻娉曠殑涓涓艦寮忓寲鎻忚堪錛屾秷鑰椾簡鎴戜笉灝戠簿鍔涳紝涓嶈繃鐩墠鐪嬫潵榪樻槸澶ц嚧鏄庣櫧浜?IMG height=20 src="http://m.shnenglu.com/Emoticons/QQ/14.gif" width=20 border=0>
鎬諱箣錛岃繖鏈洓鍚嶄箣涓嬬殑涔︼紝涔熺殑紜湁寰堝鐙埌鐨勫湴鏂癸紝浣滀負璁$畻鏈虹瀛﹂鍩熺殑鍙茶瘲錛屽畠緇欐垜鐨勭涓鍗拌薄鐨勭‘寰堟銆傚笇鏈涙垜鑳藉潥鎸佺潃鐪嬩笅鍘伙紝浠庝腑鍚告敹钀ュ吇銆?BR>
铏界劧鍙湅浜嗕竴鑺傦紝涓嶈繃涔熸秷鑰椾簡鎴戜笉灝戠殑鏃墮棿鍜岀簿鍔涳紙鐪嬫潵鍒殑涓浜涗簨鎯呬篃涓嶈兘澶借錛屼篃瑕佹姄绱т簡錛?BR>
浠婂ぉ鐨勬敹鑾峰緢澶氾紝棣栧厛瀵圭畻娉曡繖涓悕璇嶆湁浜嗘洿澶氫竴浜涚殑鎰熸ц璇嗭紝Knuth鎻愬嚭鐨勨滄湁闄愩佹槑紜畾涔夈佹湁杈撳叆銆佹湁杈撳嚭銆佹湁鏁堢巼鈥濊繖鍑犱釜鍘熷垯鎬葷粨寰楃湡鏄笉閿欙紝灝ゅ叾鏈鍓嶉潰鐨勪袱鐐瑰拰鏁堢巼闂錛屽線寰鏋勬垚浜嗗緢澶氬鏉傜殑闂錛岃憲鍚嶇殑鍥劇伒鏈哄仠鏈洪棶棰樺ぇ姒傚氨鏄湪璇磋繖涓棶棰樺惂鈥︹?BR>
鍙﹀瀵逛簬杈楄漿鐩擱櫎娉曠殑涓浜涙暟瀛︿笂鐨勬帹瀵間篃緇欎簡鎴戜笉閿欑殑鎰熻錛岃櫧鐒朵功涓婃病鏈夋槑紜殑緇欎竴涓弗鏍肩殑璇佹槑錛屼絾鏄牴鎹粬鐨勫彊榪版垜椹笂灝變綋浼氬埌浜嗙敤姣旇緝涓ユ牸鐨勬柟娉曞浣曞啓榪欎釜璇佹槑錛屼互鍙婅繖涓瘉鏄庣殑鍏抽敭鐐癸紙鎴戣寰楄瘉鏄庝腑鍏跺疄鐢ㄥ埌浜嗛氳繃鍙屽寘鍚潵浜夌浉絳夌殑鎵嬫硶錛岃繖涓槸鍏抽敭錛?BR>
綆楁硶鐨勫艦寮忓寲鎻忚堪搴旇搗浜嗘垜澶х殑鍏磋叮錛屽洖鏉ョ殑璺笂鎯籌紝璨屼技榪欎釜濂藉儚褰㈡垚浜嗘煇縐嶆暟瀛︾粨鏋勶紝鑰屽叾涓婄殑f鏄犲皠錛屾瀯鎴愪簡鏌愮浠f暟緇撴瀯錛屾病鏈変粩緇嗘兂榪囷紝涓嶈繃濂藉儚鏄繖鏍峰瓙鐨勫摝錛屾垜瑙夊緱璨屼技綆楁硶鐨勬湰璐ㄥ氨鏄煇縐嶈嚜鍔ㄧ姸鎬佹満錛屽彧涓嶈繃涓嶄竴瀹氭槸鏈夐檺鐘舵佺殑鍚э紝鑷沖皯浠庝粬鐨勬剰鎬濅笂鐪嬫槸榪欐牱鐨?BR>
寮濮嬫病鏈夌悊瑙g浜屼釜錛屽姞涓婁簡鏁堢巼綰︽潫鐨勭殑褰㈠紡鍖栬〃杈炬柟娉曠殑鎰忔濓紝鍚庢潵鑺變簡鐐規(guī)椂闂寸湅浜嗕笅Ex1.1.8,鎴戣寰楁垜浼間箮鏄庣櫧浜嗙偣
鎴戣涓篍x1.1.8鏄繖鏍風殑涓涓姸鎬佽〃
j
Theta_j
Phi_j
a_j
b_j
0
a
a
5
1
1
ab
c
3
2
2
bc
cb
1
2
3
b
a
4
3
4
c
b
0
4
5
c
c
5
5
#include <iostream>
#include <string>
using namespace std;
int main ( int argc, char *argv[] )

{
// 0, 1, 2, 3, 4, 5
string theta[]=
{ "a", "ab", "cb", "b", "c", "c"};
string phi []=
{ "a", "c", "bc", "a", "b", "c"};
int a []=
{ 5, 3, 1, 4, 0, 5};
int b []=
{ 1, 2, 2, 3, 4, 5};
int j=0;
int i=0;
string stat;
getline (cin,stat);
while(true)
{
unsigned int loc=stat.find(theta[j],0);
if (loc==string::npos)
{
j=a[j];
}
else
{
string temp=stat.substr(0,loc)+phi[j]+stat.substr(loc+theta[j].length());
stat=temp;
j=b[j];
}
cout<<i++<<":\tj("<<j<<")\tloc("<<loc<<")\t"<<stat<<endl;
cin.get();
}
return EXIT_SUCCESS;
} /**//* ---------- end of function main ---------- */
蹇靛彣鍋氫竴涓硾鍨嬬殑綆楁硶搴撳凡緇忔湁濂介暱鏃墮棿浜嗭紝鎴戣寰楄繖涓簨鎯呬笌鍏朵竴鐩磋繖涔圷Y錛岃繕涓嶅楂樺叴浜嗗氨鍐欎竴鐐癸紝涓嶉珮鍏達紝灝辨墧鐫,
鍏跺疄錛岃繖涓笘鐣屾槸涓嶇己娉涘瀷綆楁硶搴撶殑錛孲TL錛孊oost錛孊litz++涓殑娉涘瀷綆楁硶寰堝叏闈簡錛屾垜鐨勮鍒掓槸鎶婁粬浠腑闂寸己灝戠殑閮ㄥ垎琛ヨ搗鏉ワ紝涓嶈兘浜掓搷浣滅殑鍦版柟綺樺悎璧鋒潵錛屽啀鏈夊氨鏄鍔犲MetaProgramming鐨勬敮鎸?BR> 鍛靛懙錛屽簲璇ヨ繕綆楁槸涓涓瘮杈冮泟浼熺殑璁″垝鍚?BR> 鎴戝笇鏈涜繖濂楀簱鑳藉敖鍙兘鐨勯珮鏁堢巼銆佸鏄撲嬌鐢ㄣ佸悓浜嬩繚璇佸畨鍏紝鐞嗘兂鐨勫鍦版槸鑳藉浠f浛ACM闆嗚闃熶嬌鐢ㄧ殑妯″潡
First Step鈥斺擡uclid GCD鐨勪竴涓疄鐜?
//-------------------------------BEGIN:GAlgo_Euclid_GCD.hpp--------------------------//
#ifndef _GAlgo_Euclid_GCD_H_
#define _GAlgo_Euclid_GCD_H_
namespace GAlgo

{
namespace Generic
{
template <typename T>
T Euclid_GCD(const T& a,const T& b)
{
return ((a%b)==0)?b:Euclid_GCD(b,a%b);
}
}
namespace Meta
{
template <int A,int B>
struct Euclid_GCD
{
static const int value=Euclid_GCD<B,A%B>::value;
};
template <int A>
struct Euclid_GCD<A,0>
{
static const int value=A;
};
}
}
#endif
//-------------------------------END:GAlgo_Euclid_GCD.hpp--------------------------//
#include "GAlgo_Euclid_GCD.hpp"
#include <iostream>
using namespace std;
int main()

{
cout<<GAlgo::Generic::Euclid_GCD(6,9)<<endl;
cout<<GAlgo::Meta::Euclid_GCD<6,9>::value<<endl;
return 0;
}

/**///////////////////////////////
//Prime.cpp
/**///////////////////////////////
template<int Val>
struct IntType

{
const static int value = Val ;
};
template<bool flag, typename T, typename U>
struct Select

{
typedef T Result;
};
template<typename T, typename U>
struct Select<false, T, U>

{
typedef U Result;
};
template <unsigned int N,unsigned int x>
struct FindRoot

{
const static int value=Select<(N/x)==x||((N/x+x)/2==x),IntType<x>,FindRoot<N,(N/x+x)/2> >::Result::value;
};
template <unsigned int N>
struct Sqrt

{
const static int value=FindRoot<N,N/2>::value;
};
template <>
struct Sqrt<0> ;
template <int N,int divider>
struct TestPrime

{
const static int value=Select<(N%divider)==0,IntType<0>,TestPrime<N,divider-1> >::Result::value;
};
template <int N>
struct TestPrime<N,1>

{
const static int value=1;
};
template <unsigned int N>
struct IsPrime

{
const static int value=TestPrime<N,Sqrt<N>::value+1>::value;
};
template <>
struct IsPrime<2>

{
const static int value=1;
};
template <>
struct IsPrime<1>;
int printf(const char*,
);
int main()

{
const int yes=IsPrime<123127>::value;
printf("%d\n",yes);
}