算法笔记整理

今天主要看了以下内容:

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.学习了虚函数相关问题,讲的非常透彻

详细内容见:http://blog.csdn.net/v_july_v/article/details/6446364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值