一道计算奖金的编程题--三种不同的解法
2015-02-04 15:30
399 查看
题目:
利润分级,奖金的比例不同,例如10万以内比例10%,10万到20万比例是5%
解法一:
比较简单的方案就是利用if-else,效率也是最高,这里就不写这部分代码了
解法二:
利用数据结构来处理,直接上代码static BonusCalcLevel Level[] = {{100000.0, 0.10},
{200000.0-100000.0,0.05},
{400000.0-200000.0, 0.03},
{600000.0-400000.0, 0.015},
{1000000.0-600000.0, 0.007},
{0.0, 0.003}};
void BonusCalcSwitchTestDrive()
{
double income, bonus = 0;
std::cin >> income;
for (int i = 0; i < sizeof(Level)/sizeof(Level[0]); i++)
{
if (income > Level[i].income_th)
{
bonus += Level[i].income_th * Level[i].factor;
income -= Level[i].income_th;
}
else
{
bonus += income * Level[i].factor;
break;
}
}
std::cout << bonus << std::endl;
}将不同的阶段的奖金求和,在每次计算的过程中加入了判断的代码,增加了开销
解法三:
祭出设计模式中的装饰者模式,每一个部分就是求和
class Bonus {
public:
Bonus() : bonus(0.0) {}
virtual ~Bonus() {}
virtual double getBonus() { return bonus; }
private:
double bonus;
};
class BonusCalc : public Bonus {
public:
BonusCalc(double income, double x, Bonus *pB):_income(income),_factor(x),_pB(pB) {}
virtual ~BonusCalc()
{
}
virtual double getBonus();
private:
double _factor;
double _income;
Bonus *_pB;
};
double BonusCalc::getBonus()
{
return _pB->getBonus() + _income*_factor;
}
struct BonusCalcLevel {
double income_th;
double factor;
};
void BonusCalcTestDrive()
{
double income;
std::cin >> income;
Bonus *pB = new Bonus();
Bonus *pBC = pB;
std::list<Bonus*> container;
for (int i = 0; i < sizeof(Level)/sizeof(Level[0]); i++)
{
if (income > Level[i].income_th)
{
pBC = new BonusCalc(Level[i].income_th, Level[i].factor, pBC);
}
else if (income > 0)
{
pBC = new BonusCalc(income, Level[i].factor, pBC);
}
else
{
break;
}
container.push_back(pBC);
income -= Level[i].income_th;
}
std::cout << pBC->getBonus() << std::endl;
for (std::list<Bonus*>::iterator it = container.begin(); it != container.end(); it++)
{
Bonus *tmp = *it;
delete tmp;
}
delete pB;
}
效率的降低来源于对virtual function的访问,增加了一次指针的访问
trade-off:程序的结构优势与函数性能优势之间的权衡,程序中20%的代码影响着效率,核心的算法部分理应用最直接的方式
利润分级,奖金的比例不同,例如10万以内比例10%,10万到20万比例是5%
解法一:
比较简单的方案就是利用if-else,效率也是最高,这里就不写这部分代码了
解法二:
利用数据结构来处理,直接上代码static BonusCalcLevel Level[] = {{100000.0, 0.10},
{200000.0-100000.0,0.05},
{400000.0-200000.0, 0.03},
{600000.0-400000.0, 0.015},
{1000000.0-600000.0, 0.007},
{0.0, 0.003}};
void BonusCalcSwitchTestDrive()
{
double income, bonus = 0;
std::cin >> income;
for (int i = 0; i < sizeof(Level)/sizeof(Level[0]); i++)
{
if (income > Level[i].income_th)
{
bonus += Level[i].income_th * Level[i].factor;
income -= Level[i].income_th;
}
else
{
bonus += income * Level[i].factor;
break;
}
}
std::cout << bonus << std::endl;
}将不同的阶段的奖金求和,在每次计算的过程中加入了判断的代码,增加了开销
解法三:
祭出设计模式中的装饰者模式,每一个部分就是求和
class Bonus {
public:
Bonus() : bonus(0.0) {}
virtual ~Bonus() {}
virtual double getBonus() { return bonus; }
private:
double bonus;
};
class BonusCalc : public Bonus {
public:
BonusCalc(double income, double x, Bonus *pB):_income(income),_factor(x),_pB(pB) {}
virtual ~BonusCalc()
{
}
virtual double getBonus();
private:
double _factor;
double _income;
Bonus *_pB;
};
double BonusCalc::getBonus()
{
return _pB->getBonus() + _income*_factor;
}
struct BonusCalcLevel {
double income_th;
double factor;
};
void BonusCalcTestDrive()
{
double income;
std::cin >> income;
Bonus *pB = new Bonus();
Bonus *pBC = pB;
std::list<Bonus*> container;
for (int i = 0; i < sizeof(Level)/sizeof(Level[0]); i++)
{
if (income > Level[i].income_th)
{
pBC = new BonusCalc(Level[i].income_th, Level[i].factor, pBC);
}
else if (income > 0)
{
pBC = new BonusCalc(income, Level[i].factor, pBC);
}
else
{
break;
}
container.push_back(pBC);
income -= Level[i].income_th;
}
std::cout << pBC->getBonus() << std::endl;
for (std::list<Bonus*>::iterator it = container.begin(); it != container.end(); it++)
{
Bonus *tmp = *it;
delete tmp;
}
delete pB;
}
效率的降低来源于对virtual function的访问,增加了一次指针的访问
trade-off:程序的结构优势与函数性能优势之间的权衡,程序中20%的代码影响着效率,核心的算法部分理应用最直接的方式
相关文章推荐
- !!!. 数据库的编程(ADO) --- 三种sql语句执行的不同
- 一道网易游戏笔试题的不同解法
- Atitit 三种并发编程模型 艾龙 attilax总结 1. 并发系统可以使用不同的并发模型去实现。 1 2. 并行工作者 并行工作者模型。进来的任务分配给不同的工作者 银行模式 2 2.1.
- 程序员不单单要会编程,还要会思考(观《百钱百鸡》的三种解法)
- Go语言中三种不同md5计算方式的性能比较
- LeetCode - 389. Find the Difference - 三种不同解法 - ( C++ ) - 解题报告
- c基础编程:(2)根据利润计算奖金
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
- 一道经典面试题的不同解法
- 【编程题目】二进制中1的个数——三种解法的探讨(C++实现)
- Android编程实现根据不同日期计算天数差的方法
- 多个对象访问共享对象和数据的方式——一道JAVA就业面试题的不同解法
- 黑马程序员-模拟某工厂的要求编程计算某个工人的奖金
- 对一道简单例题不同解法的感受
- c 到 unix c 高级编程中计算文件大小的三种方法
- 一个小题目的三种不同的解法
- java并发编程--一道经典多线程题的2种解法
- 十九、Linux系统编程-信号(六)三种不同精度的睡眠sleep、usleep、nanosleep
- Google编程挑战赛一道250分题的解法
- 实现两数 交换的三种不同编程方法。