和为定值的两个、三个、多个、连续正数序列
2014-08-02 10:54
399 查看
1.和为定值的两个数、三个数
如果无序,先排序,排完序后,用left、right前后两个指针往中间扫(从两头夹逼),直到找到合适的数为止。1.1和为定值的两个数
#include <stdio.h> #include <stdlib.h> int cmp(const void *a, const void *b) { int *c = (int *)a; int *d = (int *)b; return (*c > *d) ? 1 : -1; } int add(int *A, int n, int sum) { int curSum, v1, v2; int flag = 0; int left = 0; /*左指针*/ int right = n-1; /*右指针*/ while (left < right) { curSum = A[left] + A[right]; if (curSum == sum) { v1 = A[left++]; v2 = A[right--]; flag = 1; printf("v1=%d, v2=%d\n", v1, v2); } else if (curSum < sum) { ++left; } else { --right; } } return flag; }
1.2和为定值的三个数
#include <stdio.h> #include <stdlib.h> int cmp(const void *a, const void *b) { int *c = (int *)a; int *d = (int *)b; return (*c > *d) ? 1 : -1; } int add(int *A, int n, int sum) { int curSum, v1, v2, v3; int flag = 0; int index, left, right; for (index=0; index<n; ++index) /*多了一个左指针起始位置的循环*/ { left = index + 1; /*左指针的起始位置,这点和两个的不同*/ right = n - 1; /*右指针*/ while (left < right) { curSum = A[index] + A[left] + A[right]; if (curSum == sum) { v1 = A[index]; v2 = A[left++]; v3 = A[right--]; flag = 1; printf("v1=%d, v2=%d, v3=%d\n", v1, v2, v3); } else if (curSum < sum) { ++left; } else { --right; } } } return flag; }
2.和为定值的多个数
#include <vector> #include <iostream> using namespace std; void findFactor(vector<int> &vec, int n, int sum) { if (n<=0 || sum<=0) /*退出的条件*/ { return ; } /*找到结果,打印输出*/ if (n == sum) { vector<int>::iterator iter; for(iter=vec.begin(); iter!=vec.end(); ++iter) { cout<<*iter<<" + "; } cout<<n<<endl; return ; } vec.push_back(n); /*使用n*/ findFactor(vec, n-1, sum-n); /*剩下的n-1个数填满sum-n*/ vec.pop_back(); /*不使用n*/ findFactor(vec, n-1, sum); /*剩下的n-1个数填满sum*/ } int main(void) { int n, sum; while (cin>>n>>sum) { cout<<"所有可能的组合:"<<endl; vector<int> vec; findFactor(vec, n, sum); } return 0; }
3.和为定值的连续正数序列
#include <stdio.h> void print(int left, int right) { int i; for (i=left; i<right; ++i) { printf("%d ", i); } printf("%d\n", i); } int findContinuousSequence(int sum) { int find = 0; int left = 1; int right = 2; int end = (1 + sum) / 2; int curSum = left + right; if (sum < 3) { return 0; } while (left < end) { if (curSum > sum) { curSum -= left; ++left; } else { if (curSum == sum) { find = 1; print(left, right); } ++right; curSum += right; } } return find; } int main(void) { int sum; while (scanf("%d", &sum)!=EOF && sum>=0) { int find = findContinuousSequence(sum); if (0 == find) { printf("Pity!\n"); } printf("#\n"); } return 0; }
相关文章推荐
- 41.和为s的两个数字VS和为s的连续正数序列
- 【面试题041】和为s的两个数字VS和为s的连续正数序列
- 面试题41和为S的两个数字VS和为s的连续正数序列
- 《剑指Offer》学习笔记--面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指offer面试题 和为s的两个数字 VS 和为s的连续正数序列
- 和为S的两个数字 & 和为S的连续正数序列
- 剑指offer---和为s的两个数字VS和为s的连续正数序列
- 剑指offer41:和为s的两个数字VS和为s的连续正数序列
- 和为s的两个数字与和为s的连续正数序列
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer-面试题41-和为s 的两个数字vs 和为s 的连续正数序列
- 剑指Offer——输入正整数S,打印出所有和为S的连续正数序列(至少含有两个正数)
- 和为s的两个数字VS和为s的连续正数序列
- 和为s的两个数字 VS 和为s的连续正数序列
- 剑指offer 41 - 和为s的两个数字VS为s的连续正数序列
- 【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
- 和为s的两个数字VS和为s的连续正数序列
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 和为S的两个数字 VS 和为S的连续正数序列