今天主要看了以下内容:
1.寻找和为定值的多个数算法,以中兴面试题为例,即:输入两个整数,从数列1,2,3……n随意取几个数,使其和等于m,要求将其中所有的可能的组合列出来。
使用了STL 的list结构。具体代码如下:
#include<list>
#include<iostream>
using namespace std;
list<int>list1;
void find_factor(int sum, int n)
{
cout<<"传入的参数为:"<<sum<<" "<<n<<endl;
// 递归出口
if(n <= 0 || sum <= 0)
return;
// 输出找到的结果
if(sum == n)
{
// 反转list
list1.reverse();
for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)
cout << *iter << " + ";
cout << n << endl;
list1.reverse();
}
list1.push_front(n);
for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)
cout <<"插入后列表值为:"<< *iter << " ";
find_factor(sum-n, n-1); //放n,n-1个数填满sum-n
cout<<"递归1"<<endl;
list1.pop_front();
find_factor(sum, n-1);//不放n,n-1个数填满sum
cout<<"递归2"<<endl;
}
int main()
{
int sum, n;
cout << "请输入你要等于多少的数值sum:" << endl;
cin >> sum;
cout << "请输入你要从1.....n数列中取值的n:" << endl;
cin >> n;
cout << "所有可能的序列,如下:" << endl;
find_factor(sum,n);
return 0;
}
2.求连续子数组的最大和问题
(1)既有负数又有正数
#include<iostream>
using namespace std;
int maxsum(int* a,int n)
{
int sum=0;
int b=0;
for(int j=0;j<n;j++)
{
if(b<0)
b=a[j];
else
b+=a[j];
if(sum<b)
sum=b;
}
return sum;
}
int main()
{
int a[10]={1,-2,10,4};
cout<<maxsum(a,5)<<endl;
return 0;
}
(2)处理全部负数数组,返回最的负值
#include<iostream>
using namespace std;
#define n 4
int maxsum(int a[n])
{
int max=a[0];
int sum=0;
for(int j=0;j<n;j++)
{
if(sum>=0)
sum+=a[j];
else
sum=a[j];
if(sum>max)
max=sum;
}
return max;
}
int main()
{
int a[10]={-1,2,-3,-4};
cout<<maxsum(a)<<endl;
return 0;
}
3.学习了亲合数问题(转自360百科)
在自然数220与284之间,有一种非常奇妙的关系,能够整除220的全部正整数(不包括220)之和1+2+4+5+10+20+11+22+55+110恰好等于284;而能够整除284=22×71的全部正整数(不包括284)之和1+2+4+71+142又恰好等于220。这是绝妙的吻合!数学上,具有这样特征的数叫“亲合数”。毕达哥拉斯发现的220与284,是人类认识的第一对亲合数,也是最小的一对亲和数。
4.学习了虚函数相关问题,讲的非常透彻