实战训练1—输出九九乘法表
问题描述:
在学校里学过九九乘法表,编程实现打印九九乘法表。
输入格式:
无输入
输出格式:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
问题分析:
仔细观察乘法表,可以发现由行列构成,每列的个数正好等于所在的行数,类似于之前介绍过的字符图形,使用for循环嵌套可以解决此问题。外循环变量i来控制行数,起始值为1,终值为9,更新表达式为自增表达式,内循环变量j来控制列数,起始值为1,由于第1行有1个等式,第2行有2个等式,……,内层循环变量j的终值为行数i,更新表达式也为自增表达式,由外循环变量i和内循环变量j相乘的等式构成了内循环的循环体,内循环加输出换行共同构成外循环体。具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;i<=9;i++){//定义外层循环,循环变量i来控制行数,从1到9
for(int j=1;j<=i;j++){//定义内层循环,循环变量j来控制列数,从1到i
cout<<i<<'*'<<j<<'='<<i*j<<' ';//输出i和j相乘的等式
}
cout<<endl;//输出换行
}
return 0;
}
如果想让九九乘法表里面的等式对齐,如下面运行结果:
1*1= 1
2*1= 2 2*2= 4
3*1= 3 3*2= 6 3*3= 9
4*1= 4 4*2= 8 4*3=12 4*4=16
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
可以采用格式化输出来实现,让i*j的值占两列,并且右对齐,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;i<=9;i++){//定义外层循环,循环变量i来控制行数,从1到9
for(int j=1;j<=i;j++){//定义内层循环,循环变量j来控制列数,从1到i
printf("%d*%d=%2d ",i,j,i*j);//格式化输出i,j以及i和j相乘的结果
}
printf("\n");//输出换行
}
return 0;
}
实战训练2—换零钱
某人想将面值为100元的人民币兑换成若干张5元、2 元和1元面值的纸币,但要求零钱总数为50张,并且每种面值的纸币至少1张,请输出每一种可能的换法。
输入格式:
无
输出格式:
输出若干行,每行包含一种换法,分别表示5元的张数,2元的张数和1元的张数,中间用空格隔开。
输入输出样例:
输入样例 | 输出样例 |
无 | 1 46 3 2 42 6 3 38 9 4 34 12 5 30 15 6 26 18 7 22 21 8 18 24 9 14 27 10 10 30 11 6 33 12 2 36 |
问题分析:
根据题意,将100元的人民币兑换成5元、2元和1元的零钱,每种零钱至少1张,所以5元的取值可以从1到20(100元全部换5元的话,最多20张),2元的取值是1到50张(100元全部换2元,最多可以换50张),剩下的全部为1元的张数,要求列举出所有的方案数,所以可以使用for嵌套循环来实现,用外层循环变量i来控制5元的张数,内层循环j来控制2元的张数,那么1元的张数就为(50-i-j),外层循环变量i,起始值为1,终值为20,循环变量更新表达式为自增运算,内层循环变量j,起始值为1,终值为50,循环变量更新表达式也为自增运算,内层循环的循环体,首先计算1元的张数k为k=50-i-j,然后计算所有零钱的面值之和是否为100,5元的张数乘以5加上2元的张数乘以2,再加上1的张数乘以1,即5*i+2*j+k==100,同时这三种零钱的张数不能为0,由于外循环变量和内循环变量的取值都不为0,因此需要保证k不能为0,如果两个条件表达式与的结果为真,那么输出该方案可行,输出这三种零钱的张数,如果两个条件表达式与的结果为假,那么该方案不可行,内循环是外循环的循环体。具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;i<=20;i++){//定义外循环,循环变量i为5元的张数,从1到20
for(int j=1;j<=50;j++){//定义内循环,循环变量j为2元的张数,从1到50
int k = 50-i-j;//定义1元的张数
if((i*5 +j*2+k==100) && (k!=0))//判断零钱面值总和是否为100,并且所有的零钱张数不能为0
cout<<i<<' '<<j<<' '<<k<<' '<<endl;
}
}
return 0;
}