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;
}
网硕互联帮助中心




评论前必须登录!
注册