5. 爱因斯坦阶梯
题目编号:Exp02-Basic10,GJBook3-04-15
题目名称:爱因斯坦阶梯
问题描述:设有阶梯,不知其数,但知:每步跨2阶,最后剩1阶;每步跨3阶,最后剩2阶;每步跨5阶,最后剩4阶;每步跨7阶,正好到楼顶。编程序求最少共有多少阶。
输入:无
输出:台阶数目
样例:无。详见输入输出说明。
#include <iostream> using namespace std; int main() { int a; for (a = 7;;a += 14) { if ((a % 3 == 2) && (a % 5 == 4)) { cout << a; break; } } return 0; }
将数学的思想与算法结合将会简化运算
由“每步跨7阶,正好到楼顶”得知,a应该为7的倍数,即a一定为奇数,所以我们没必要在for循环中加上(a%2==1)(a为偶数)的条件;
随后应该注意的是,题目要求“编程序求最少共有多少阶”,基于此,我们要在输出第一个a后退出for循环。
6. 嵌套函数
题目编号:Exp02-Basic05
题目名称:嵌套函数
题目描述:编写程序,当x=1.0、2.0、…、20.0时,计算如下函数到5层嵌套。F(x)=1+1/(1+1/(1+1/(1+1/(1+1/x))))
输入:一个浮点数表示x的值,输入保证x不为零。
输出:一个浮点数F(x)的值,保留小数点后3位。
样例:11.625
看到有的同学直接把这个嵌套函数复制进代码然后打印输出,个人不是很推荐这种做法(没有对循环结构进行强化,而且治标不治本,如果输出y个嵌套呢?),所以我们还是来写for循环吧
#include <iostream> #include <iomanip> using namespace std; int main() { double x = 1.0, y = 1.0; cin >> x; if (x != 0) { for (int i = 0;i < 5;i++) { y = 1 + 1.0 / x; x = y; } cout << fixed << setprecision(3) << y; } return 0; }
7. 括号统计
题目编号:Exp02-Basic02
题目名称:括号统计
题目描述:编程序,判断给定以字符‘@’结束的字符序列中‘(’与‘)’、‘[’与‘]’、‘{’与‘}’的个数是否相等。
输入:输入一串以字符‘@’结束的字符序列,其间可能含有若干空白字符。
输出:个数不相等的括号(按花括号、方括号、圆括号的顺序);如果三种括号的个数都相等,输出NULL。
样例1:输入:{a+b*c+(d/e-f]}}@输出:{}[]()样例2:
输入:{a + b*c+(d/e-f]}@输出:[]()
#include <iostream> using namespace std; int main() { char ch=0; int a1 = 0, a2 = 0, b1 = 0, b2 = 0, c1 = 0, c2 = 0;//计数器 while(ch!='@') { cin >> ch; if (ch == '(') a1++; if (ch == ')') a2++; if (ch == '[') b1++; if (ch == ']') b2++; if (ch == '{') c1++; if (ch == '}') c2++; } if (a1 != a2) cout << "()"; if (b1 != b2) cout << "[]"; if (c1 != c2) cout << "{}"; if((a1==a2)&&(b1==b2)&&(c1==c2)) cout << "NULL"; return 0; }
看到上面那段代码,老观众肯定跳起来说:“什么?难道你不再爱for循环了吗?”,哈哈哈,其实不然
while循环对于不知道循环次数的情况时非常好用,这也是for循环的一个小小的缺点
8. (程序题)
题目编号:Exp02-Enhance04,GJBook3-04-14
题目名称:字母矩阵
题目描述:用循环语句控制打印如下图形,其中输出的每个字母占用2个字符宽度(空格在前,字母在后)。
输入:无
输出:如上图字母矩阵
说明:请同学们根据字母、位置的规律实现该程序。打表爽一时,考试两行泪~
闲话少叙,直接上代码
#include <iostream> using namespace std; int main() { cout << " A B C D E F G H I" << endl; cout << " B C D E F G H I A" << endl; cout << " C D E F G H I A B" << endl; cout << " D E F G H I A B C" << endl; cout << " E F G H I A B C D" << endl; cout << " F G H I A B C D E" << endl; cout << " E F G H I A B C D" << endl; cout << " D E F G H I A B C" << endl; cout << " C D E F G H I A B" << endl; cout << " B C D E F G H I A" << endl; cout << " A B C D E F G H I" << endl; return 0; }
搞错了,重来!不会真的有同学按照上面那种方式打表吧,不会吧不会吧
那我们还是用循环语句来写吧
#include <iostream> using namespace std; int main() { char arr[18] = {'A','B','C','D','E','F','G','H','I','A','B','C','D','E','F','G','H','I' }; for (int i = 0;i < 6;i++)//行数 { //行的内容 for (int j = i;j < 9 + i;j++) { cout << " "<<arr[j]; } cout << endl; } for (int i = 5;i >0;i--) { for (int j = i-1;j <i+8;j++) { cout << " "<<arr[j]; } cout << endl; } return 0; }
可以看到,在定义数组时没有选择A到I,而是从A到I再从A到I,哈哈哈哈哈哈哈哈哈
这样做其实是为了避免再写一个循环左移的函数
for循环还是一样,外层定义行,内层定义行的内容
特别注意,输出每一行的内容时,要确保输出9个字符