一个全排列的变形问题

2011-04-16 wcdj

 

原问题
http://topic.csdn.net/u/20110413/17/2258341c-e705-4e02-84af-121f73183ef1.html

有0~9个十个数,用其添满下面式子,写一个算法进行实现,要求十个空不能重复。
()()()+()()()=()()()();

方法1 :使用STL中的next_permutation算法

#include <iostream> #include <vector> #include <algorithm> #include <iomanip> #include <ctime> using namespace std; int cnt; int main() { clock_t beg, end; beg = clock(); vector<int> v; for (int i = 0; i<10; ++i) { v.push_back(i); } while (next_permutation(v.begin(), v.end())) { if(0 == v[0] * v[3] * v[6])// 最高位为0的情况不输出 { continue; } if( (100*v[0]+10*v[1]+v[2]) + (100*v[3]+10*v[4]+v[5]) == (1000*v[6]+100*v[7]+10*v[8]+ v[9])) { cout<<v[0]<<v[1]<<v[2]<<"+"<<v[3]<<v[4]<<v[5]<<"="<<v[6]<<v[7]<<v[8]<<v[9]<<endl; ++cnt; } } cout << cnt << endl; end = clock(); // 小数点后只输出两位 cout << setiosflags(ios::fixed); cout.precision(2); cout << "Time used: " << (double)(end - beg)/CLOCKS_PER_SEC << " s" << endl; return 0; } /* output: ...... 96 Time used: 103.84 s */ 

 

方法2 :自己实现全排

#include <iostream> #include <iomanip> #include <ctime> using namespace std; int cnt; void sort(int depth) { static int flag[10]; if(0 == depth) { if(0 == flag[0] * flag[3] * flag[6]) return; int addFirst = flag[0] * 100 + flag[1] * 10 + flag[2]; int addSecond = flag[3] * 100 + flag[4] * 10 + flag[5]; int addSum = flag[6] * 1000 + flag[7] * 100 + flag[8] * 10 + flag[9]; if(addFirst + addSecond == addSum) { cout<<addFirst<<"+"<<addSecond<<"="<<addSum<<endl; ++cnt; } return; } for(int choose = 0; choose < 10; ++choose) { if(0 != flag[choose]) continue; flag[choose] = depth - 1; sort(depth - 1); flag[choose] = 0; } } int main() { clock_t beg, end; beg = clock(); sort(10); cout << cnt << endl; end = clock(); cout << setiosflags(ios::fixed); cout.precision(2); cout << "Time used: " << (double)(end-beg)/CLOCKS_PER_SEC << " s" << endl; return 0; } /* output: ...... 96 Time used: 1.00 s */

 

 

你可能感兴趣的:(ios,算法,output,permutation)