思路:找总数太简单了,写个找所有满足条件的数的code吧。
3位数的数字之和最多27,0不用考虑,所以建一个size为27的bucket,遍历所有的三位数组合,按数字和分类放入bucket里面,这样要得到要求的6位数,只要前三位和后三位在同一个bucket就可以了。复杂度就是n^3+27*n^2~1000+2700~O(n^3), n=10. 这里用string来存每个整数,一个是节省空间,还有就是输出的code写起来方便,如果要把结果存入变量,只要append两个三位数的string就行了。
- void findall(){
- //set up an array, each element stores strings with sum = index of the element
- vector<string> digit3[27];
- string str;
- //group 3-digit integers with equal sum into each array element
- for(int i = 0; i < 10; i++){
- for(int j = 0; j < 10; j++){
- for(int k = 0; k < 10; k++){
- int sum = i + j + k;
- if(sum > 0) {
- str.clear();
- str.push_back(i+'0');
- str.push_back(j+'0');
- str.push_back(k+'0');
- digit3[sum-1].push_back(str);
- }
- }
- }
- }
- //print out all 6-digit numbers
- for(int i = 0; i < 27; i++){
- //len is the number of 3-digit integers with sum = i
- int len = digit3[i].size();
- for(int j =0; j < len; j++){
- for(int k = 0; k < len; k++){
- string str1 = digit3[i][j];
- string str2 = digit3[i][k];
- if(str1[0] != '0') cout<<str1<<str2<<endl;
- }
- }
- }
- }
No comments:
Post a Comment