C++枚举算法(2)

文章详细解释了如何用C++编写代码来解决整数满足勾股定理的组合、生理周期的同步查找、字符串子串出现次数统计和和为特定值的查找等问题。
摘要由CSDN通过智能技术生成

满足条件的整数

题目描述: 假设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++)/*因为题目里说了a,b,c都大于1*/
	{
		for(int b=a;b<=100;b++)
		{
			//c是可以算出来的,所以不需要for循环,可以节省内存 
			if(a*a+b*b==sqrt(a*a+b*b)*sqrt(a*a+b*b)&&(int)sqrt(a*a+b*b)==sqrt(a*a+b*b)&&sqrt(a*a+b*b)<=100/*要保证c是整数并且c<=100*/)
			{
				cout<<a<<"*"<<a<<" + "<<b<<"*"<<b<<" = "<<sqrt(a*a+b*b)<<"*"<<sqrt(a*a+b*b)<<endl;
			}
		}
	}
	
	
	return 0;
}

做法二:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int a=2;a<=100;a++)/*因为题目里说了a,b,c都大于1*/
	{
		for(int b=a;b<=100;b++)
		{
			for(int c=2;c<=100;c++)
			{
				if(a*a+b*b==c*c)
				{
					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 a,b,c,d;
	cin>>a>>b>>c>>d;
	for(int i=d;i<=21252;i++)
	{
		if(i%23==a%23&&i%28==b%28&&i%33==c%33)
		{
			cout<<i-d;
			return 0;
		}
	}
	
	
	return 0;
}

子串计算

题目描述: 给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。 输入 一行,一个01字符串。 输出 对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。按子串的字典 序从小到大依次输出,每行一个。

样例输入

10101

样例输出

0 2

01 2

1 3

10 2

101 2

#include<bits/stdc++.h>
using namespace std;
string w(int,int,string);
string b[110];
int lb=0;
int main()
{
	string a;
	cin>>a;
	int n=a.size();//获取string的长度
	int cnt[110]={0};
	for(int i=0;i<n;i++)
	{
		for(int j=i;j<n;j++)
		{
			bool f=true;
			for(int k=0;k<lb;k++)
			{
				if(w(i,j,a)==b[k])
				{
					cnt[k]++;
					f=false;
					break;
				}
			}
			if(f==true)
			{
				b[lb]=w(i,j,a);
				cnt[lb]=1;
				lb++;
			}
		}
	}
	for(int i=0;i<lb-1;i++)
	{
		for(int j=0;j<lb-1-i;j++)
		{
			if(b[j]>b[j+1])
			{
				swap(b[j],b[j+1]);
				swap(cnt[j],cnt[j+1]);
			}
		}
	}
	for(int i=0;i<lb;i++)
	{
		if(cnt[i]>=2)
		{
			cout<<b[i]<<" "<<cnt[i]<<endl;
		}
	}
	
	
	return 0;
}
string w(int s,int e,string n)
{
	string z="";
	for(int i=s;i<=e;i++)
	{
		z=z+n[i];
	}
	return z;
}

找和为K的两个元素

题目描述: 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。 输入 第一行输入序列的长度n和k,用空格分开。 第二行输入序列中的n个整数,用空格分开。 输出 如果存在某两个元素的和为k,则输出yes,否则输出no。

样例输入

9 10

1 2 3 4 5 6 7 8 9

样例输出

yes

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int k;
	cin>>k;
	int a[110];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(a[i]+a[j]==k)
			{
				cout<<"yes";
				return 0;
			}
		}
	}
	cout<<"no";
	
	
	return 0;
}

猴子吃桃

题目描述: 海滩上有一堆桃子,N只猴子来分。第一只猴子把这堆桃子平均分为N份,多了一个,这只猴子把多 的一个扔入海中,拿走了一份。第二只猴子接着把剩下的桃子平均分成N份,又多了一个,它同样把多 的一个扔入海中,拿走了一份。第三、第四、……,第N只猴子仍是最终剩下的桃子分成N份,扔掉多了 的一个,并拿走一份。 编写程序,输入猴子的数量N,输出海滩上最少的桃子数,使得每只猴子都可吃到桃子。 输入 一个整数N。 输出 输出当猴子数量为N时海滩上最少的桃子数。结果保证在int型范围内。

样例输入

2

样例输出

7

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int sum=1;
	for(int i=0;i<n;i++)
	{
		sum=sum*n+1;
//因为每一只猴子都要扔掉一个桃子,所以+1,而拿走的那一份又是n份的其中之一,要还原就得*n
	}
	cout<<sum;
	
	
	return 0;
}

余数相同问题

题目描述: 已知三个正整数 a,b,c。 现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。 请问满足上述条件的x的最小值是多少? 数据保证x有解。 输入 一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。 输出 一个整数,即满足条件的x的最小值。

样例输入

300 262 205

样例输出

19

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b,c;
	cin>>a>>b>>c;
	for(int x=2;true;x++)
	{
		int e,y,z;
		e=a%x;
		y=b%x;
		z=c%x;
		if(e==y&&e==z&&y==z)
		{
			cout<<x;
			return 0;
		}
	}
	
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值