19C++循环结构-多重循环(2)
一、三重循环与程序的优化
百钱买百鸡
3文钱可以买1只公鸡,2文钱可以买1只母鸡,1文可以买3只小鸡,要用100文买100只(每种鸡必买1只)。
试编一程序,求公鸡,母鸡、小鸡各有多少只?
如果100文钱全部买公鸡,最多可以买儿?33只;如果100文钱全部买母鸡,最多可以买几只?50只;如果100文全部买小鸡,最多可以买几只?300只?不对,鸡一共有100只。所以小鸡最多是100只。可以用枚举法,依次枚举每种鸡的只数,如果同时满足“百钱”“百鸡”两个条件。那么就输出每种鸡相应的只数。
公母+母鸡+小鸡=100只
买公鸡的钱+买母鸡的钱+买小鸡的钱=100文
三重循环执行:33x50x100=165000次
优化简化为双重循环:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int gongji,muji,xiaoji;
cout<<setw(5)<<"公鸡"<<setw(5)<<"母鸡"<<setw(5)<<"小鸡"<<endl;
for(gongji=1;gongji<=33;gongji++)
for(muji=1;muji<=50;muji++)
{
xiaoji=100-gongji-muji;
if(gongji*3+muji*2+xiaoji/3.0==100)
cout<<setw(5)<<gongji<<setw(5)<<muji<<setw(5)<<xiaoji<<endl;
}
return 0;
}
练习:
(1)常听说计算机中了“木马”:下面关于“木马”描述正确的是( )
A.是指木头做的马
B.是指计算机中非常隐秘的恶意程序,能直接对计算机产生危害
C.木马病毒是通过特定的木马程序来控另一台计算机
D.如果计算机中了木马,该计算机任何时间都会被木马控制
(2)阅读程序写结果
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i, j, ans=0;
i=l;
while(i<=3)
{
for(j=1;j<=5;j++)
ans+=j;
i++;
}
cout << ans<< endl;
return 0;
}
i,j,ans输出:________________
(3)完善程序。
有一个三位数,个位数字比百位数字大,而百位数字又比十位数并且各位数字之和等于各位数字相乘之积,求此三位数。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int ge, shi, bai ans;
for(shi=1; shi<=7;shi++)
for(bai=shi+1; bai<=8; bai++)
for(ge=bai+1; ge<=9; ge++)
{
if(______)
{
_________;
cout<<ans<<endl;
}
}
return 0;
}
二、四重循环
教学视频
问题:


#include <iostream>
using namespace std;
int main()
{
int a1,a2,a3,a4,n;
for(a4=0;a4<=1;a4++)
for(a3=0;a3<=1;a3++)
for(a2=0;a2<=1;a2++)
for(a1=0;a1<=1;a1++)
{
n=a4*8+a3*4+a2*2+a1*1;
cout<<a4<<a3<<a2<<a1<<"B "<<n<<endl;
}
return 0;
}

练习:
(1)
(2)阅读程序写结果
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i, j, ans=0;
i=l;
while(i<=3)
{
j=l;
do
{
ans+=i*i;
j++;
}while(j<=5);
i++;
}
cout << ans <<endl;
return 0;
}
i,j,ans输出:________________
(3)完善程序。
狐狸老师又布置了一个新任务,完成后可以获得(100)2元比特童币.任务要求用0,1.2,3,4.5.6.7八个数字组成三位数的奇数,共有多
少个,分别是那几个?
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int b,s,g,shu,count=0;
for(b=1; b<=7;b++)
for(s=0;s<=7;___)
for(g=1;g<=7;g=g+2)
{
shu=b*100+s*10+g;
cout<<shu <<"";
______________;
}
cout<< endl;
cout<<"个数:"<<count<<endl;
return 0;
}
三、超市收费程序
教学视频
比特超市是风之巅小学的同学们用比特童币换购商品的地方,每个月最后一周的周五12:00到12:40开放、由同学们轮流经营。为了能自动算出每位来换购的同学应付的货款,自动算出超市一天的营业额,自动统计一天换购的人数,需要一个简易的超市收费程序。
试编一个超市收费程序,实现上述功能。
超市一天来多少位同学是不确定的,可以用一个结束标志来检查是否一天结束了。每位同学换购的商品种类也不一样,可以在每位同学换购结束时输入一个特殊的数作为结束标志。同时需要设两个累加器,一个累加每位同学应付的贷款,一个累加一天的营业额。设一个计数器,记录换购的人数。
n为每个物品的价格,用素加器sumone累加一位同学应付的货款,用累加器sum累加一天的营业额,用计数器num统计一天换吻的人数。当输入0时为一个人结束,当输入-1时为一天结束。流程图如图

#include <iostream>
using namespace std;
int main()
{
int num=0;
float n,sumone,sum;
bool flag;
flag=true;
sum=0.0;
while(flag)
{
sumone=0.0;
do
{
cin>>n;
if(n==-1)
{
flag=false;
break;
}
sumone+=n;
}while(n!=0);
cout<<"当前顾客应付的货款:" ;
cout <<sumone<<endl;
if(sumone!=0) num++;
sum+=sumone;
}
cout<<"今天的营业额:"<<sum<<endl;
cout<<"今天的顾客人数:"<<num<<endl;
return 0;
}
练习
(1)下列不属于网络连接设备的是()。
A.网卡 B.交换机 C. TCP/IP D.路由器
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int i,j,p,ans=0,
i=l;
do
{
p=l;
j=l;
while(j<=5)
{
p*=j;
j++;
}
ans+=p;
1++;
}while(i<=3);
cout << ans<< endl;
return 0;
}
i,j,p,ans输出:_____________
3.完善程序。
输入一个整数,把它分解成若干个质因数乘积的形式。
#include <iostream>
using namespace std;
int main()
{
int n,i;
_____________;
cout<<n<<'n';
for(i=2; n!=1;i++) //n没有除尽,就重复操作
{
while(n%i==0) //n能被i整除,就重复做除法操作
{
cout<< i;
_________;
if(n!=1)cout <<'*';
}
}
return 0;
}

浙公网安备 33010602011771号