码题集——魔数、A的B次方、网球比赛、三角形、点与线段的关系
目录
MT1173 魔数
MT1174 A的B次方
MT1175 网球比赛
MT1177 三角形
MT1178 点与线段的关系
MT1173 魔数
一个数字,把他乘以二,会得到一个新的数字,如果这个新数字依然由原数中那些数字组成,就称原数为一个魔数。输入正整数N,检查它是否是一个魔数,输出YES或者NO。
格式
输入格式:输入正整数N
输出格式:输出YES或者NO
样例 1
输入:142857
输出:YES
思路:数由0~9组成,所以可以使用数组,将数组下标设为某数位,值为该数位数的个数,再进行遍历判断两个数组的各个位置的值是否相同。
此方法可以满足题目隐含条件,即每个数字出现的次数与原来数字出现次数相同
注意!!数组一定要初始化为0,如果不将其初始化,当该数不存在某数时系统会为其值随机生成一个数,会影响后续的判断
#include<bits/stdc++.h> using namespace std;int main( )
{int n;cin>>n;int m=n*2;int a[10]={0},b[10]={0};//一定要初始化为0//因为该数不一定有某数,此时系统会随机生成数字,会影响结果的判断while(n){a[n%10]++;n/=10;}while(m){b[m%10]++;m/=10;}for(int i=0;i<9;i++)if(a[i]!=b[i]){cout<<"NO";return 0;}cout<<"YES";return 0;
}
MT1174 A的B次方
输入正整数N,判断它是否可以表示为A的B次方,其中B>1,A>0,都是整数。输出YES或者NO。
格式
输入格式:输入正整数N
输出格式:输出YES或者NO
样例 1
输入:6
输出:NO
能通过所有样例:
#include<bits/stdc++.h> using namespace std;int n;int main( )
{cin>>n;for(int i=1;i<1000;i++)for(int j=2;j<1000;j++)if(pow(i,j)==n){cout<<"YES";return 0;}cout<<"NO";return 0;
}
第三个样例超时,不知道为什么:
#include<bits/stdc++.h> using namespace std;int n;bool check(int x)
{int tmp=1;while(1){tmp*=x;if(tmp==n)return true;if(tmp>n)return false;}
}
int main( )
{cin>>n;if(n==1){cout<<"YES";return 0;}for(int i=2;i<=n/2;i++)if(check(i)){cout<<"YES";return 0;} cout<<"NO";return 0;
}
MT1175 网球比赛
两个网球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。
格式
输入格式:无
输出格式:分3行输出,见样例
样例 1
输入:无
输出:
a with z b with x c with y
思路:
分别设两个数组,将a,b,c和x,y,z都看作0,1,2,此时在循环中又都看做i,j,k
易知,i!=j && i!=k && j!=k
又有a不与x比,c不与x,z比,则i!=0,k!=0,k!=2
#include<bits/stdc++.h> using namespace std;int n;int main( )
{char a[3]={'a','b','c'};char b[3]={'x','y','z'};for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)if(i!=j&&i!=k&&j!=k&&i!=0&&k!=0&&k!=2){cout<<a[0]<<" with "<<b[i]<<endl;cout<<a[1]<<" with "<<b[j]<<endl;cout<<a[2]<<" with "<<b[k]<<endl;}return 0;
}
MT1177 三角形
输入三角形的三个顶点坐标,和点N的坐标。判断N是否位于三角形内,输出YES或者NO。
格式
输入格式:
第一行输入三角形的三个顶点坐标(x1,y1),(x2,y2)和(x3,y3),第二行输入点N的坐标,整型,空格分隔。
输出格式:输出YES或者NO
样例 1
输入:
0 0 20 0 10 30 10 15
输出:YES
思路:
1.面积法:
将该点与三角相连,算出三个三角形的面积并相加,判断其是否小于等于该三角形面积(不是等于,当点在线上时面积是0)
2.同向法(叉乘法):
3.重心坐标法:
面积法:
#include<bits/stdc++.h> using namespace std;int n;double check(int x1,int y1,int x2,int y2,int x3,int y3)
{return abs(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2.0;
}
int main( )
{int x1,y1,x2,y2,x3,y3;cin>>x1>>y1>>x2>>y2>>x3>>y3;int a,b;cin>>a>>b;double s1=check(x1,y1,x2,y2,a,b);double s2=check(x1,y1,x3,y3,a,b);double s3=check(x3,y3,x2,y2,a,b);double s=check(x1,y1,x2,y2,x3,y3);if(s1+s2+s3<=s)cout<<"YES";elsecout<<"NO";return 0;
}
MT1178 点与线段的关系
输入线段的2个端点的坐标值x和y,再输入第3个点的坐标,判断点在不在线段上,输出YES或者NO。
格式
输入格式:按照先起点(x,y)再终点(x,y)的次序。第二行输入第3个点的坐标。坐标整型。第一行两点之间空格,如样例所示。
输出格式:输出YES或者NO
样例 1
输入:
(-20,20) (-20,-10) (0,0)
输出:NO
思路:
判断是否在线段上:
1.中间一点与旁边两个距离之和等于线段长度。
2. 向量法
注意!!易错点:
没有说是整型一定要以实数输入。
输入格式:
错的:
double x1,y1,x2,y2;
double a,b;
scanf("(%lf,%lf) (%lf,%lf)",&x1,&y1,&x2,&y2);
scanf("(%lf,%lf)",&a,&b);对的:
double x1,y1,x2,y2;
double a,b;
scanf("(%lf,%lf) (%lf,%lf) \n (%lf,%lf)",&x1,&y1,&x2,&y2,&a,&b);
#include<bits/stdc++.h>
using namespace std;int main()
{double x1,y1,x2,y2;double a,b;scanf("(%lf,%lf) (%lf,%lf)",&x1,&y1,&x2,&y2);scanf("(%lf,%lf)",&a,&b);double l=sqrt(pow((x1-x2),2.0)+pow((y1-y2),2.0));double l1=sqrt(pow(x1-a,2.0)+pow(y1-b,2.0));double l2=sqrt(pow(x2-a,2.0)+pow(y2-b,2.0));if(l1+l2==l)cout<<"YES";elsecout<<"NO";return 0;
}