鉴于一线码农的算法博文基本通过C#完成,此处用C++再实现一遍,具体解法可参考其博文。
地址:http://www.cnblogs.com/huangxincheng/category/401959.html。
1.百钱买百鸡(降低时间复杂度)
void NumofHen_1() { int x, y, z; for ( x = 1; x < 20; x++) { for ( y = 0; y < 33; y++) { z = 100 - x - y; if ((z % 3 == 0) && ((5 * x + 3 * y + z / 3) == 100)) { cout << "公鸡:" << x << " 母鸡:" << y << " 小鸡:" << z << endl; } } } } void NumofHen_2() { int x, y, z; for (size_t k = 0; k < 4; k++) { x = 4 * k; y = 25 - 7 * k; z = 75 + 3 * k; cout << "公鸡:" << x << " 母鸡:" << y << " 小鸡:" << z << endl; } }
2.五家五井(不定方程组,运用数据为整数特性)
代码省略,详情见一线码农相应博客。
3.猴子吃桃(尾递归)
题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。
以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?
int SumPeach1(int day) { if (day == 10) return 1; else return 2 * SumPeach1(day + 1) + 2; } void NumofPeach_1() { int sum = SumPeach1(1); cout << "桃子数目:" << sum << endl; } //尾递归(剑指offer上有类似题目,判定二叉树是否平衡) int SumPeach_2(int day, int sum) { if (day == 10) return sum; else return SumPeach_2(day + 1, 2 * sum + 2); } void NumofPeach_2() { int sum = SumPeach_2(1, 1); cout << "桃子数目:" << sum << endl; }
尾递归将每次计算结果进行传递,但是具体效果得看编译器是否进行了相应优化。
此题还有更为简单的做法,具体为参考每次计算数值的规律性,与2的次方存在对应关系。
时间: 2024-10-13 02:43:58