⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taohui.cpp

📁 可以处理股市的套汇问题
💻 CPP
字号:
#include "iostream"
#include "algorithm"
#include "vector"
#include <fstream>
using namespace std;
vector<int> vect;//用一个向量的全局变量,以标记递归时的路径
float sum=1;//当前vect中的汇率乘积,避免了重复计算

void findcy(float ** mtx,int scale,int *sign)//传入矩阵,矩阵大小,以及用sign数组标记该货币标号是否以被加入环中
{
	for(int i=0;i<scale;i++)//在每层递归中,循环置入货币标号,构成路径
	{
		if(sign[i]<0)//若已被加入,则不加入,开始下一个标号的操作
			continue;
		
		float temp;//加入该标号后,考察环路汇率乘积
        if(vect.size()!= 0)
		{
		sum=sum*mtx[vect.back()][i];
		temp=sum*mtx[i][vect.front()];
		}
		
		sign[i]=-1;//该标号已访问过
		vect.push_back(i);//把该标号加入向量末尾
		
		if(temp > 1.00001)//若汇率积大于1,则输出
		{
			cout<<"Have a dividen path:";
			copy(vect.begin(),vect.end(),ostream_iterator<int>(cout,"-"));
			cout<<vect.front();
			cout<<"\t"<<"the dividen is "<<temp<<endl; 
		}
		
		findcy(mtx,scale,sign);//进行下一级递归

		sign[i]=1;//维护数组及向量保持原来的状态,进行下一次循环准备
		vect.pop_back();
		if(vect.size()!= 0)
		   sum=sum/mtx[vect.back()][i];

	}
	
	return;	

}

void main()
{
	ifstream ifs("data.txt");//从客户文件中读取汇率矩阵及规模
	int scale;
	ifs>>scale;
	

	float ** mtx=new float*[scale];//给二维数组分配动态内存空间
	for(int i=0;i<scale;i++)
	{
	   mtx[i]=new float[scale];
	} 
	
	
	int m,n;//把矩阵信息存入二维数组
	for(m=0;m<scale;m++)
		for(n=0;n<scale;n++)
			ifs>>mtx[m][n];
	ifs.close();

	int * sign=new int[scale];//建立标记数组sign,并把起初是化为元素均为1
	for(int j=0;j<scale;j++)
		sign[j]=1;
	
	findcy( mtx, scale, sign);//进行递归调用,找到所有的路径

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -