2008年11月10日月曜日

第4問 解答例

第4問(6点)の解答例です

#include<stdio.h>
#include<math.h>
int getr(char*);
int getg(char*);
int getb(char*);int main(void){
char a[8];
char cl[][8]={"black","blue","lime","aquq","red","fuchsia","yellow","white"};int r,g,b,clr[8],clg[8],clb[8],i,clnum;
float dk2, min;

clr[0]=0;clr[1]=0;clr[2]=0;clr[3]=0;clr[4]=255;clr[5]=255;clr[6]=255;clr[7]=255;
clg[0]=0;clg[1]=0;clg[2]=255;clg[3]=255;clg[4]=0;clg[5]=0;clg[6]=255;clg[7]=255;
clb[0]=0;clb[1]=255;clb[2]=0;clb[3]=255;clb[4]=0;clb[5]=255;clb[6]=0;clb[7]=255;while(scanf("%s",&a),a[0]!='0'){r=getr(a);g=getg(a);b=getb(a);min=sqrt(pow(r-clr[7],2)+pow(g-clg[7],2)+pow(b-clb[7],2));
clnum=7;
for(i=6;i>=0;i--){
dk2=sqrt(pow(r-clr[i],2)+pow(g-clg[i],2)+pow(b-clb[i],2));
if(dk2<=min){min=dk2;clnum=i;};}
printf("カラーは %s\n",cl[clnum]);}
return 0;
}

int getr(char a[]){
int i,j;
if(a[1]>='0' && a[1]<='9')
i=a[1]-'0';
else
i=a[1]-'a'+10;
if(a[2]>='0' && a[2]<='9')
j=a[2]-'0'; else j=a[2]-'a'+10;
return (i*16+j);
}
int getg(char a[]){
int i,j;
if(a[3]>='0' && a[3]<='9')
i=a[3]-'0';
else
i=a[3]-'a'+10;
if(a[4]>='0' && a[4]<='9')
j=a[4]-'0';
else j=a[4]-'a'+10;
return (i*16+j);
}

int getb(char a[]){
int i,j;
if(a[5]>='0' && a[5]<='9')
i=a[5]-'0';
else
i=a[5]-'a'+10;
if(a[6]>='0' && a[6]<='9')
j=a[6]-'0';
else j=a[6]-'a'+10;
return (i*16+j);

2008年11月8日土曜日

第5問 解答例

第5問(8点)です。
第4問は論理バグが取れないので、ちょっと止めました。

#include<stdio.h>
#include<math.h>

#define pi 3.141592
#define R 6378.1
int main(void){
float a,b,c,d,e;
float A,B,C,D;
while(scanf("%f %f %f %f",&a,&b,&c,&d),!(a==-1 && b==-1 && c==-1 && d==-1)){
A=a*pi/180;B=b*pi/180;C=c*pi/180;D=d*pi/180;
e=pow(cos(C)*cos(D)-cos(A)*cos(B),2) + pow(cos(C)*sin(D)-cos(A)*sin(B),2)+pow(sin(C)-sin(A),2);
printf("%0.0lf\n",R*acos(1-0.5*e));
}
return 0;
}

これは8点ですが、球面座標がわかってれば非常に易しい。

2008年11月7日金曜日

第3問 解答例

ans3.c(6点) の内容です。
入力値には、1000000まで入れてエラーが起きないようにプログラム構造を作る必要がある。

#include <stdio.h>
void main(void){
long n;int m,i,count=0;
int p[20];
for(i=0;i<20;i++)p[i]=0; m=n-(n/4)*4; n=n/4;
for( i=count-1;i>=0;i--) printf("%d",p[i]);
for(i=0;i<20;i++)p[i]=0;
putchar('\n');
count=0;
}
}

2008年11月6日木曜日

第2問 解答例

回答例
第1問と同じ点数なのに、随分難しくなっている(^_^;)

2.c(6点) の内容
#include <stdio.h>
#include <string.h>
void main(void){
char game[101],nextgame[101] ;
int i , At= 0 , Bt=0 ;
scanf("%s",&game);
do{
scanf("%s",&nextgame);
for(i=0;game[i]!='\0';i++){
if(i>0) if(game[i]=='A') At++; else Bt++; }
if(nextgame[0]=='A') At++;
if(nextgame[0]=='B') Bt++;
if(nextgame[0]=='0' && game[i-1]=='A')At++;
if(nextgame[0]=='0' && game[i-1]=='B')Bt++;
printf("%d %d\n",At,Bt);
At = 0; Bt=0;
strcpy(game , nextgame);
}while(nextgame[0]!='0');
}

第1問 解答例

ans1.c(6点)の内容
これは、易しすぎ(^_^)

#include <stdio.h>
#define MAX 9
void main(void){
char cl[16] ;
int ent1 = 0 ,ent2 = 0 , count=0;
while(scanf("%s %d %d",&cl,&ent1,&ent2),count < MAX){
printf("%s %d %d\n",cl,ent1+ent2,ent1*200+ent2*300);
count++;
}
}