最近研究幾個經典演算法,比如二分尋找,大數相加等。加強一下編碼思路訓練,這幾個演算法都不是很難,基本可以在演算中得到代碼實現步驟,如下:
#include<stdio.h>#include<string>#include<vector>#include <iostream>using namespace std;#define MAX 1010const int NotFound = -1;int Bsearch(const vector<string> &v, int start, int stop, string key) //二分尋找,遞迴實現。當然之間用迴圈就可以了。{ if (start > stop) { return NotFound; } int mid = (start + stop)/2; if (key == v[mid]) { return mid; } else if (key < v[mid]) { return Bsearch(v, start, mid - 1, key); } else { return Bsearch(v, mid + 1, stop, key); }}string bignumadd(const string str1, const string str2) //大數相加{ int a[MAX] = {0}, b[MAX] = {0}; int len1, len2, i, k, up = 0; int len = 0; char buf[512] = {0}; len1 = str1.length(); len2 = str2.length(); for(i = len1 - 1, k = 0; i >= 0; --i) a[k++] = str1[i] - '0'; for(i = len2 - 1, k = 0; i >= 0; --i) b[k++] = str2[i] - '0'; for(i = 0, up = 0; i < MAX; ++i) { a[i] = a[i] + b[i] + up; up = a[i] / 10; a[i] %= 10; } for(i = MAX -1; i >= 0; --i) if(a[i]) break; len += sprintf(buf + len, "%s + %s = ", str1.c_str(), str2.c_str()); for(k = i; k >= 0; --k) { len += sprintf(buf + len ,"%d", a[k]); } string str(buf); printf("%s\n", buf); return str;}void RecPermute(string sofar, string rest) //全排列(遞迴演算法){ if (rest == "") { cout << sofar << endl; } else { for (int i = 0; i < rest.length(); i++) { string next = sofar + rest.at(i); string remaining = rest.substr(0, i) + rest.substr(i + 1, rest.length() - i); RecPermute(next, remaining); } }}void move(int n,char src,char dest,char tmp) //漢諾塔問題{ if(n==1) printf("\t%c->%c\n",src,tmp); //當n只有1個的時候直接從a移動到c else { move(n-1,src,tmp,dest); //第n-1個要從a通過c移動到b printf("\t%c->%c\n",src,tmp); move(n-1,dest,src,tmp); //n-1個移動過來之後b變開始盤,b通過a移動到c,這邊很難理解 }}int main(){ RecPermute("","ABCD"); return 0;}
******************************************************************************************************************
qsort排序函數在結構體數組中的運用
比如實現如下要求:
先按照學生姓名字典序排序,學生姓名一樣的,按照分數從大到小排序。執行個體代碼如下:
//============================================================================// Name : CTest.cpp// Author : @CodingGeek// Version : 1.0// Copyright : Your copyright notice// Description : 幾種常見的STL容器學習研究//============================================================================#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;typedef struct{ int id; char name[20]; int score;}T_Member;T_Member g_MemIdTbl[] ={ {1001, "zhangsan", 79}, {1004, "lisi", 78}, {1008, "wangwu", 85}, {1006, "zhaoliu", 87}, {1007, "sunqian", 67}, {1005, "wangyong", 78}, {1009, "caoxie", 76}, {1003, "wangwu", 90},};#define SIZE sizeof(g_MemIdTbl) / sizeof(g_MemIdTbl[0])int compare_fun(const void *a, const void *b){ T_Member *pa = (T_Member*)a; T_Member *pb = (T_Member*)b; if (strcmp(pa->name,pb->name) != 0) { return strcmp(pa->name,pb->name); } else { return pb->score - pa->score; }}int main(){ qsort(g_MemIdTbl, SIZE, sizeof(g_MemIdTbl[0]),compare_fun); for (unsigned i = 0; i < SIZE; i++) { cout << g_MemIdTbl[i].id<<":"<<g_MemIdTbl[i].name <<":" << g_MemIdTbl[i].score << endl; } return 0;}