C语言_练习(八)
70、颜色精简
有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现在有若干个颜色值需要映射到集合中的某个值。具体的映射方法是找到集合中和它的颜色距离最小的进行映射。在RGB颜色系统中,颜色用 (R,G,B) 三元组表示,R,G,B是0到255之间的整数。两个颜色之间的距离定义如下:假设给定两个颜色的三元组分别是 (Ra,Ga,Ba) 和 (Rb,Gb,Bb) ,那么他们之间的距离 D=√((Ra−Rb)2+(Ga−Gb)2+(Ba−Bb)2) 。
#include <stdio.h>
#include <math.h>
int main() {
int a,b;
int rgb[100][3];
int c[3];
double e;
scanf("%d",&a);
for(b=1;b<=a;++b){
for(int i=0;i<3;i++){
scanf("%d",&rgb[b][i]);
}
}
while(1)
{ for(int t=0;t<3;t++){
scanf("%d",&c[t]);
}
if(c[0]==-1) break;
double d=1000000;
int m,n,z;
for(b=1;b<=a;++b)
{
e=sqrt(pow(rgb[b][0]-c[0],2)+pow(rgb[b][1]-c[1],2)+pow(rgb[b][2]-c[2],2));
if(e<d)
{
m=rgb[b][0];n=rgb[b][1];z=rgb[b][2];d=e;
}
}
printf("(%d,%d,%d)\n",m,n,z);
}
return 0;
}
71、购物
有一条圆形公路,半径为X个单位。Noder的家在这条公路上,有一个超市也在这条公路上。家和超市所形成的圆心角为Z度。
现在车子上有L升油,一升油能开5个单位的路程。问Noder用这L升油能不能先从家开到超市购物,然后再从超市回家。
#include <stdio.h>
#include <math.h>
int main() {
int num = 0;
double pi=2.0*asin(1.0);
scanf("%d",&num);
for(int i = 0; i<num; i++){
int r,l,z;
scanf("%d %d %d",&r,&l,&z);
z = z>180?360-z:z;
double circum = pi*r;
double dis = (double)z / 180 * circum *2;
if(l*5>=dis){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
72、幼儿园霸王
幼儿园里面的小朋友在玩橡皮泥,每一个小朋友都有一块橡皮泥。每一块橡皮泥都是一个长方体块。从橡皮泥的大小可以看出哪一个小朋友是老大,哪一个小朋友是小弟。拥有橡皮泥体积最大的小朋友总喜欢欺负拥有橡皮泥体积最小的小朋友。
现在给出n个小朋友的橡皮泥,请输出谁欺负了谁。
#include<stdio.h>
#include<string.h>
int main(){
int a,b,c,d,i,max,min;
char e[100],lname[100],mname[100];
scanf("%d",&a);
for(i=1;i<=a;i++){
scanf("%d%d%d",&b,&c,&d);
gets(e);
if(i==1){
max=min=d*b*c;
strcpy(lname,e);
strcpy(mname,e);
}
else{
if(b*c*d>max)
{max=b*c*d;
strcpy(mname,e);}
if(b*c*d<min)
{min=b*c*d;
strcpy(lname,e);}
}
}
printf("%s%s",mname,lname);
return 0;
}
73、吃葡萄
在房间中G颗葡萄,现在有n个人。这n个人依次进入房间吃葡萄。每个人进去的时候都做如下操作,把葡萄分成n等份,发现还多出一颗,然后吃掉这一颗以及n等份中的一份,然后走出房间。这n个人吃完之后,最后房间里面的葡萄刚好可以分成n等分。问n最大是多少?
#include<stdio.h>
int main()
{
int a,i,p,q,b,c;
scanf("%d",&a);
for(i=1;i<=a;i++)
{
scanf("%d",&b);
c=b;
for(c=b;c>0;c--)
{
for(p=b,q=c;q>0;q--)
{if(p%c!=1)
break;
p=p-(p/c)-1;}
if(q!=0)
continue;
if(p%c==0)
{
printf("%d\n",c);
break;
}
}
if(c==0)
printf("No Solution\n");
}
return 0;
}
74、可译编码
一个符号集合的编码被称为可译编码的条件是,集合中没有哪一个符号的编码是另外一个符号的编码的前缀。
例如,现在有一个集合中含有四种符号 {X, Y, P, Q} 他们对应的编码是:
X:01, Y:10, P:0010, Q:0000
那么这样的编码是可译编码。如果是下面这种情况:
X:11, Y:00, P:011, Q:0010
就不是可译编码,因为Y的编码是Q的编码的前缀。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int n;
int i,j;
char s[100][10];
int flag=1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(strlen(s[i])<strlen(s[j])){
if(strstr(s[j],s[i])==s[j]){
flag=0;
break;
}
}
else{
if(strstr(s[i],s[j])==s[i]){
flag=0;
break;
}
}
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
基础练习——完