题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
思路:最初我们找到数组的第一个数字和最后一个数字。首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。
#include "stdafx.h" #include<iostream> bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2) { bool found = false; if(length < 1 || num1 == NULL || num2 == NULL) return found; int ahead = length -1; int behind = 0; while(ahead > behind) { long long curSum = data[ahead] + data[behind]; if(curSum == sum) { *num1 = data[behind]; *num2 = data[ahead]; found = true; break; } else if(curSum > sum) ahead --; else behind ++; } return found; } int main() { int data[] = {1,2,4,7,11,15}; int length = sizeof(data)/sizeof(int); int sum = 15; int num1, num2; int result = FindNumbersWithSum(data, length, sum, &num1, &num2); if(result) { if(num1 + num2 == sum) printf("%d %d ", num1, num2); else printf("Failed. "); } else printf("Failed. "); return 0; }
题目:输入一个正数S,打印出所有和为S的连续正数序列(至少有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6和7~8.
思路:
两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。
1 #include "stdafx.h" 2 3 void PrintContinuousSequence(int small, int big); 4 5 void FindContinuousSequence(int sum) 6 { 7 if(sum < 3) 8 return; 9 10 int small = 1; 11 int big = 2; 12 int middle = (1 + sum) / 2; 13 int curSum = small + big; 14 15 while(small < middle) 16 { 17 if(curSum == sum) 18 PrintContinuousSequence(small, big); 19 20 while(curSum > sum && small < middle) 21 { 22 curSum -= small; 23 small ++; 24 25 if(curSum == sum) 26 PrintContinuousSequence(small, big); 27 } 28 29 big ++; 30 curSum += big; 31 } 32 } 33 34 void PrintContinuousSequence(int small, int big) 35 { 36 for(int i = small; i <= big ; i ++) 37 printf("%d ", i); 38 39 printf(" "); 40 } 41 42 int main(int argc, char const *argv[]) 43 { 44 int sum = 9; 45 printf("test for %d: ", sum); 46 FindContinuousSequence(sum); 47 48 sum = 15; 49 printf("test for %d: ", sum); 50 FindContinuousSequence(sum); 51 52 sum = 100; 53 printf("test for %d: ", sum); 54 FindContinuousSequence(sum); 55 56 return 0; 57 }