循环——枚举算法(c++)(进到3级啦!)

目录 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int ma = -99999;
	for(int a1 = 0;a1<=n;a1++)
	{
		for(int a2 = 0;a2<=n;a2++)
		{
			for(int a3 = 0;a3<=n;a3++)
			{
				if((a1+a2)%2==0&&(a2+a3)%3==0&&(a1+a2+a3)%5==0)
				{
					ma = max(ma,a1+a2+a3);
				}
			}
		}
	}
	cout<<ma;
	return 0;
}

鸡兔同笼
描述
一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至
少有多少只动物,至多有多少只动物。
输入
一行,一个正整数a (a < 32768)。
输出
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。
如果没有满足要求的答案,则输出两个0,中间用一个空格分开。
样例输入
20
样例输出
5 10
这道题有两种方法。第一种是枚举,比较复杂;第二种的直接计算更简便,但逻辑有些难理解。
第一种:
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int mi = 99999;
	int ma = -99999;
	for(int i = 0;i<=n/2;i++)
	{
		int j = (n-i*2)/4;
		if((i!=0||j!=0)&&i*2+j*4==n)
		{
			ma = max(ma,i+j);
			mi = min(mi,i+j);
		}
	}
	if(mi!=99999&&ma!=99999)
	{
		cout<<mi<<" "<<ma;
		return 0;
	}
	cout<<"0 0";
	return 0;
}

第二种:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n%2==0)
	{
		if(n%4==0)
		{
			cout<<n/4<<" ";
		}
		else
		{
			cout<<n/4+1<<" ";
		}
		cout<<n/2;
	}
	else
	{
		cout<<"0 0";
	}
	return 0;
}

两倍
描述
给定 2 15 个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一
个数的两倍。比如给定 1 4 3 2 9 7 18 22 ,得到的答案是 3 ,因为 2 1 的两倍, 4 2 个两倍, 18 9
的两倍。
输入
一行,给出 2 15 个两两不同且小于 100 的正整数。最后用 0 表示输入结束。
输出
一个整数,即有多少个数对满足其中一个数是另一个数的两倍。
样例输入
1 4 3 2 9 7 18 22 0
样例输出
3
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int a[20] = {0};
	int n = 0;
	while(true)
	{
		int t;
		cin>>t;
		if(t==0)
		{
			break;
		}
		a[n] = t;
		n++;
	}
	int cnt = 0;
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<n;j++)
		{
			if(a[j]*2==a[i])
			{
				cnt++;
				break;
			}
		}
	}
	cout<<cnt;
	return 0;
}

完美立方
描述
形如a^3= b^3 + c^3 + d^3的等式被称为完美立 方等式。例如123= 6^3 + 8^3 + 10^3 。编写一 个程序,对任给的正整数N (N≤100),寻找所有 的四元组(a, b, c, d),使得a^3 = b^3 + c^3 + d^3,其中a,b,c,d 大于 1, 小于等于N,且b<=c<=d。
输入
一个正整数N (N≤100)。
输出
每行输出一个完美立方。输出格式为:
Cube = a, Triple = (b,c,d)
其中a,b,c,d所在位置分别用实际求出四元组值代入。 请按照a的值,从小到大依次输出。当两个完美立 方等式中a的值相同,则b值小的优先输出、仍相 同则c值小的优先输出、再相同则d值小的先输出。
样例输入
24
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 9, Triple = (1,6,8)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for(int a = 2;a<=n;a++)
	{
		for(int b = 2;b<=n;b++)
		{
			for(int c = b;c<=n;c++)
			{
				for(int d = c;d<=n;d++)
				{
					if(a*a*a==b*b*b+c*c*c+d*d*d)
					{
						cout<<"Cube = "<<a<<",Triple = ("<<b<<","<<c<<","<<d<<")"<<endl;
					}
				}
			}
		}
	}
	return 0;
}

满足条件的整数
描述
假设a、b、c均为整数,且满足a,b,c 大于1,并且小于等于100,找出所有符合条件:“a^2+
b^2= c^2”的整数组。
输入
无。
输出
按a从小到大的顺序输出所有满足条件的整数组(若a相同,则按b从小到大的顺序输出),每行
一组,每一组数据的输出样式为:
a*a + b*b = c*c
注意:
1)为避免重复输出,要求a<=b;
2)加号和等号左右各有一个空格,除此之外无多余空格。
#include <bits/stdc++.h>
using namespace std;
int main()
{
	for(int a = 2;a<=100;a++)
	{
		for(int b = 2;b<=100;b++)
		{
			for(int c = 2;c<=100;c++)
			{
				if(a*a+b*b==c*c&&a<=b)
				{
					cout<<a<<"*"<<a<<" + "<<b<<"*"<<b<<" = "<<c<<"*"<<c<<endl;
				}
			}
		}
	}
	return 0;
}

生理周期
描述
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面 表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间) 下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10, 下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
输入
一行,包含四个整数:p, e, i和d,相邻两个整数之间用单个空格隔开。 p, e, i分别 表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是 给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于等于365, 所求 的时间小于等于21252。
输出
一个整数,即从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
样例输入
4 5 6 7
样例输出
16994
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int p,e,i,d;
	cin>>p>>e>>i>>d;
	int a = 1,b = 1,c = 1;
	while(a*23+p<=21252+d)
	{
		b = 1;
		while(b*28+p<=21252+d)
		{
			c = 1;
			while(c*33+p<=21252+d)
			{
				if(a*23+p==b*28+e&&b*28+e==i+c*33)
				{
					cout<<a*23+p-d;
					return 0;
				}
				c++;
			}
			b++;
			c = 1;
		}
		a++;
		b = 1;
		c = 1;
	}
	return 0;
}

和数
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
输入
共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个不大于10000的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出
一个整数,即数列中等于其他两个数之和的数的个数。
样例输入
4
1 2 3 4
样例输出
2
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[110];
	int cnt = 0;
	for(int i = 0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i = 0;i<n;i++)
	{
		for(int j = i;j<n;j++)
		{
			for(int k = 0;k<n;k++)
			{
				if(a[i]+a[j]==a[k]&&i!=j&&j!=k&&i!=k)
				{
					cnt++;
				}
			}
		}
	}
	cout<<cnt;
	return 0;
}

因子问题
描述
任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。
输入
包括两个整数N、M。N不超过1,000,000。
输出
输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出-1
样例输入
35 10
样例输出
5
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,m,b;
	cin>>n>>m;
	for(int a = 1;a<m;a++)
	{
		b = m-a;
		if(n%a==0&&n%b==0)
		{
			cout<<a;
			return 0;
		}
	}
	cout<<-1;
	return 0;
}

最简真分数
描述
给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的
组合。
输入
第一行是一个正整数n(n<=600)。
第二行是n个不同的整数,相邻两个整数之间用单个空格隔开。整数大于1且小于等于1000。
输出
一个整数,即最简真分数组合的个数。
样例输入
7
3 5 7 9 11 13 15
样例输出
17
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[610] = {0};
	int cnt = 0;
	for(int i = 0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<n;j++)
		{
			bool f = true;
			if(a[i]>=a[j])
			{
				f = false;
			}
			else
			{
				for(int k = 2;k<=min(a[i],a[j]);k++)
	    		{
		    		if(a[i]%k==0&&a[j]%k==0)
		    		{
	    				f = false;
	    				break;
	    			}
	    		}
			}
			if(f==true)
			{
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值