在c++中,循环有很多用处,这次来讲一下
一、枚举
怎么说?让我们看几道例题
1. 鸡兔同笼问题(1)
题目描述
鸡兔同笼是中国古代的数学名题之一。大约在1500年前,《孙子算经》中就记载了这个有趣的问题。有若干只鸡兔同在一个笼子里,从上面数,有50个头,从下面数,有160只脚。问笼中各有多少只鸡和兔?
输入
无
输出
一行,两个整数用空格隔开,分别表示鸡,兔的数目。
题目分析
这道题从头的个数开始遍历,最后看哪一个符合
鸡 | 兔 | 总腿数 |
---|---|---|
0 | 50 | 50 × 4 + 0 × 2 = 200 50×4+0×2=200 50×4+0×2=200 |
1 | 49 | 49 × 4 + 1 × 2 = 198 49×4+1×2=198 49×4+1×2=198 |
2 | 48 | 48 × 4 + 2 × 2 = 196 48×4+2×2=196 48×4+2×2=196 |
3 | 47 | 47 × 4 + 3 × 2 = 194 47×4+3×2=194 47×4+3×2=194 |
… | ||
49 | 1 | 1 × 4 + 49 × 2 = 102 1×4+49×2=102 1×4+49×2=102 |
50 | 0 | 0 × 4 + 50 × 2 = 100 0×4+50×2=100 0×4+50×2=100 |
题解
#include <iostream>
using namespace std;
int main() {
for(int x=0; x<=50; x++) { //x是鸡的腿数
int y = 50 - x; //y是兔的腿数
if(x*2+y*4==160) {
printf("%d %d", x, y);
break;
}
}
return 0;
}
鸡兔同笼问题(2)
题目描述
有若干只鸡兔同在一个笼子里,从上面数,有n个头,从下面数,有m只脚。问笼中各有多少只鸡和兔?
输入
两个数,分别是n
和m
输出
还是一行,两个整数用空格隔开,分别表示鸡,兔的数目。
解析
和上道题的意思一样
题解
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for(int x=0; x<=n; x++) { //x是鸡的腿数
int y = n - x; //y是兔的腿数
if(x*2+y*4==m) {
printf("%d %d", x, y);
break;
}
}
return 0;
}
二、最大公因数 & 最小公倍数
要了解什么是最大公因数和最小公倍数,那么就要了解什么是公因数和公倍数,还要了解什么是因数和倍数。讲不了这么多,就大概说一下
最大公因数是两个数的公有的最大因数,n
和m
的最大公因数记作(n, m)
或者gcd(n, m)
;最小公倍数是两个数共有的最小因数,n
和m
的最小公倍数记作[n, m]
或者lcm(n, m)
。看以下例子
最大公因数
24的因数:1, 2, 3, 4, 6, 8, 12, 24
16的因数:1, 2, 4, 8, 16
24和16的公因数:1, 2, 4, 8
24和16的最大公因数:8
最小公倍数
24的倍数:24, 48, 72, 96, 120, 144......
16的倍数:16, 32, 48, 64, 80, 96......
24和16的公倍数:48, 96......
24和16的最小公倍数:48
好了,'\002'
正文开始
1. 求最大公因数
题目描述
求两数a, b的最大公因数
输入
输入两个数,代表a和b
输出
a和b的最大公因数
解析
在算两个数的最大公因数时,可以试试欧几里得算法
设两数为a、b(a>b),求a与b最大公因数,先用a除以b,如果余数为0,那么gcd(a, b) = b,否则用b除以余数,再次重复,直到余数为0,最终算式的除数为a和b的最大公因数
求 36 和 24 的最大公因数
36 ÷ 24 = 1 ...... 12
24 ÷ 12 = 2
∴ gcd(36, 24) = 12
求 96 和 128 的最大公因数
128 ÷ 96 = 1 ...... 32
96 ÷ 32 = 3
∴ gcd(a, b) = 32
题解
#include <iostream>
using namespace std;
int main() {
int a, b; //a为被除数 b为除数
cin >> a >> b;
if(a<b) {
swap(a, b); //这个是交换函数,可以交换两个变量的值
}
while(a%b) { //相除看是否有余数
int t = a % b; //t表示余数
a = b;
b = t;
}
cout << b; //输出最终除数
}
1. 求最小公倍数
题目描述
求两数a, b的最小公倍数
输入
输入两个数,代表a和b
输出
a和b的最小公倍数
解析
因为a和b的公因数都有最大公因数,所以用乘积除以最大公因数就是了
题解
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int r = a * b; //用r来记录a和b的乘积
if(a<b) {
swap(a, b); //这个是交换函数,可以交换两个变量的值
}
while(a%b!=0) {
int t = a % b;
a = b;
b = t;
}
cout << r/b;
return 0;
}
三、图形打印
这个不过多讲,总之找规律就是了
1. 长方形
输入数字n和m,输出一个n*m布局的*
长方体
题解
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for(int i=0; i<m; i++) { //竖向打印
for(int j=0; j<n; j++) { //横向打印
cout << '*';
}
cout << endl; //换行
}
return 0;
}
2. 正方体
输入数字n,画出一个边长为n的正方体
题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) { //横向竖向都一样
for(int j=0; j<n; j++) {
cout << '*';
}
cout << endl; //换行
}
return 0;
}
3. 等腰直角三角形
输入数字n,画出一个腰长为n的等腰三角形
题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
cout << '*';
}
cout << endl; //换行
}
return 0;
}
4. 等边三角形
输入数字n,画出一个高为n的等边三角形
题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++) {
for(int j=n-i; j>=0; j--) {
cout << ' ';
}
for(int j=0; j<i*2-1; j++) {
cout << '*';
}
for(int j=n-i; j>=0; j--) { //13-15可以不要
cout << ' ';
}
cout << endl; //换行
}
return 0;
}
4. 平行四边形
输入数字n,画出一个高为n的平行四边形
题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++) {
for(int j=n-i; j>=0; j--) {
cout << ' ';
}
for(int j=0; j<n; j++) {
cout << '*';
}
for(int j=0; j<i; j++) { //13-15可以不要
cout << ' ';
}
cout << endl; //换行
}
return 0;
}
今天就写到这(有点多)
把这个点成红色的
拜拜