云计算百科
云计算领域专业知识百科平台

C++初学者学习(四)

1.1 循环的练习

题目名称:金币

deepseek解题思路:

#include <iostream>
using namespace std;
int main(){
int n,i,j,day=0,sum=0;
cin>>n;
for(i=1;i<=n;i++){// 第i组:连续i天,每天获得i枚金币
for(j=1;j<=i;j++){
if(day<n){// 如果达到总天数就停止
sum=sum+i;// 每天获得i枚金币
day++;// 记录已经过去的天数
}
}
}
cout<<sum;
return 0;
}
//去掉if的改写
//#include <iostream>
//using namespace std;
//int main(){
// int n,i,j,day=0,sum=0;
// cin>>n;
// for(i=1;day!=n;i++){         i<=n不是判断循环结束的必要条件,可以去掉
// for(j=1;j<=i;j++){
// sum=sum+i;
// day++;
// }
// }
// cout<<sum;
// return 0;
//}
//为了更快的执行,一组一组的领取
#include <iostream>
using namespace std;
int main(){
int n,i,j,day=0,sum=0;
cin>>n;
for(i=1;day!=n;i++){
if(day+i<=n){
sum=sum+i*i;
day=day+i;
}
else{
sum=sum+(n-day)*i;
day=n;
}
}
cout<<sum;
return 0;
}

1.2 开关灯

#include <iostream>
using namespace std;
int main(){
int N,M,i,flag;
cin>>N>>M;
for(i=1;i<=N;i++){//灯的编号
       //int s=0; 操作次数
       //可以-1和1,下面直接flag=flag*(-1)
flag=0;//0开灯 1关灯
for(int j=1;j<=M;j++){//人的编号
if(i%j==0){
if(flag==0){
flag=1;
}
else{
flag=0;
}
               //s++;
}
}
if(i==1){
cout<<i;
}
       //if(s%2!=0&&i!=1)
if(flag==1&&i!=1){
cout<<","<<i;
}
}
return 0;
}

1.3 枚举算法

解题思路:

  • 明确枚举的对象、范围和判定条件。

  • 逐一枚举可能的解,验证每个解是否是问题的解。

例题:百钱买百鸡:公鸡5,母鸡3,1钱3只小鸡,各买几只?

#include <iostream>
using namespace std;
int main(){
int i,j,k;
for(i=0;i<=20;i++){//公鸡
for(j=0;j<=33;j++){//母鸡
           //k=100-i-j;
           //if(k%3==0&&5*i+3*j+k/3==100){
           // cout<<i<<" "<<j<<" "<<k<<endl;
           //}
for(k=0;k<=99;k+=3) {//小鸡
if(i+j+k==100&&5*i+3*j+k/3==100){//100只和100钱
cout<<i<<" "<<j<<" "<<k<<endl;
}
}
}
}
return 0;
}

例题:勾股数

输入一个正整数n,输出n以内所有的勾股数。

勾股数满足:a*a+b*b=c*c

请输出所有满足条件的等式。

样例输入:10

样例输出:

3 4 5

6 8 10

#include <iostream>
using namespace std;
int main(){
int n,a,b,c;
cin>>n;
for(a=1;a<n;a++){
for(b=1;b<n;b++){ //可以写b=a起点
for(c=b+1;c<=n;c++) {
if(a*a+b*b==c*c&&a<=b){//这里就可以去掉a<=b
cout<<a<<" "<<b<<" "<<c<<endl;
}
}
}
}
return 0;
}

我家的门牌号

#include <iostream>
using namespace std;
int main(){
int n,i,j,sum;
cin>>n;
//数据保证有唯一解,所以直接让它一直循环,一定会停止
for(i=1;i>0;i++){ //总门牌号
sum=0;
for(j=1;j<=i;j++){
sum=sum+j; //总门牌号和
}
for(j=1;j<=i;j++){//我家的门牌号
if(sum-j*2==n){
cout<<j<<" "<<i<<endl;
return 0;
}
}
}
return 0;
}

练习题:Minecraft

长宽高最小都是1,最大都是n

枚举对象:长宽高 枚举范围:1~n

#include <iostream>
using namespace std;
int main(){
int n,i,j,k,s,Mins;
Mins=8000;//不可能比这个数值大
cin>>n;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(k=1;k<=n;k++){
if(i*j*k==n){
s=(i*j+i*k+j*k)*2;
if(s<Mins){
Mins=s;
}
}
}
}
}
cout<<Mins;
return 0;
}

2.1 五户共井问题(枚举)

#include <iostream>
using namespace std;
int main(){
int l,n1,n2,n3,n4,n5,a,b,c,d,e;
cin>>l>>n1>>n2>>n3>>n4>>n5;
l=l*100;
for(int i=1;i<=l;i++)//井深
{
for(a=1;a<i;a++){
for(b=1;b<i-a;b++){
for(c=1;c<i-b;b++){
for(d=1;d<=i-b-c;d++){
for(e=1;e<=i-c-d;e++){
if (a*n1+b==i&&b*n2+c==i&&b*n3+c==i&&c*n4+d==i&&d*n5+e==i&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
{
cout<<l<<" "<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
return 0;
}
}
}
}
}
}
}
cout<<"not found";
return 0;
}

上面这个解法,一直在执行,没有停过,效率低

continue:结束本次循环,还是要执行,执行下一个循环。 break是结束这个循环。

//代码优化
#include <iostream>
using namespace std;
int main(){
int l,n1,n2,n3,n4,n5,a,b,c,d,e;
cin>>l>>n1>>n2>>n3>>n4>>n5;
l=l*100;
for(int i=1;i<=l;i++)//井深
{
for(a=1;a<i;a++)
{
for(b=1;b<i;b++)
{
if(a==b||a*n1+b<i) continue;
if(a*n1+b>i) break;
for(c=1;c<i;c++)
{
if(a==c||b==c||b*n2+c<i) continue;
if(b*n2+c>i) break;
for(d=1;d<i;d++)
{
if(a==d||b==d||c==d||c*n3+d<i) continue;
if(c*n3+d>i) break;
for(e=1;e<i;e++)
{
if(a==e||b==e||c==e||d==e) continue;
if (d*n4+e==i&&e*n5+a==i)
{
cout<<i<<" "<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
return 0;
}
}
}
}
}
}
}
cout<<"not found";
return 0;
}
另一种数学思维的解法

#include <iostream>
using namespace std;
int main(){
int l,n1,n2,n3,n4,n5,a,b,c,d,e;
cin>>l>>n1>>n2>>n3>>n4>>n5;
l=l*100;
for(int i=1;i<=l;i++)//井深
{
for(a=1;a<i;a++){
b=i-n1*a;
c=i-n2*b;
d=i-n3*c;
e=i-n4*d;
if (d*n4+e==i&&e*n5+a==i&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
{
cout<<i<<" "<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
return 0;
}
}
}
cout<<"not found";
return 0;
}

2.2 数组

变量只能存储一个数据:点

数组能够同时存储大量数据:线

定义:数据类型 数组名[数组的长度]; 长度要比实际的定义的大(一定不要刚刚好)!!

类型统一,下标从0开始!!!

数组必须先定义,后使用。

还可作标记数组(用起来相对更难)

数组的初始化:

1.直接赋值(=)

int a[15]={1,2,3,4,5};

等同于

a[0]=1;

a[1]=2;

a[2]=3;

a[3]=4;

a[4]=5;

2.输入语句

#include <iostream>
using namespace std;
int main(){
   int a[15];
   int n,i;
   cin>>n;
   for(i=1;i<=n;i++){
       cin>>a[i];
  }
   for(i=1;i<=n;i++){
       cout<<a[i]<<" ";
  }
   return 0;
}

例题1:输出一个整数序列中与指定数字相同的数的个数。

输入包含三行:第一行为n,表示整数序列的长度(n<=100)。

第二行为n个整数,整数之间以一个空格隔开。

第三行包含一个整数,为指定的整数m。

输出为n个整数中与m相同的数的个数。

样例输入:

3

3 2 2

2

样例输出:2

#include <iostream>
using namespace std;
int main(){
int a[110];
int n,m,t=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>m;
for(int i=0;i<n;i++){
if(m==a[i]){
t++;
}
}
cout<<t;
return 0;
}

例题2:高个子的人数

给定n个同学的身高(均为100-200之间的整数),求超过平均身高的同学人数。

输入要求:第一行包含一个整数n,n<=10000。

第二行包含n个正整数,之间用一个空格隔开。

输出要求:一行一个整数,表示超过平均身高的同学的人数。

样例输入:

6

160 155 170 175 172 164

样例输出:3

#include <iostream>
using namespace std;
int main(){
int a[10010];
int n,t=0,sum=0,pj;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum=sum+a[i];
}
pj=sum/n;
for(int i=0;i<n;i++){
if(a[i]>=pj){
t++;
}
}
cout<<t;
return 0;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » C++初学者学习(四)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!