C++枚举算法(2)
满足条件的整数
题目描述: 假设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;
}