2012年1月11日 星期三

acm 10783: Odd Sum

[心得]  0.004
判斷奇數 ,照題目說的做就好了

#include <stdio.h>
int main()
{
   int data;
   int a,b,i,sum=0,counter=1;
   scanf("%d",&data);
   while(data)
   {   
       int sum =0;                
       scanf("%d %d",&a,&b);
       for(i=a;i<=b;i++)
       if(i%2==1)
         sum = sum+ i;               
       printf("Case %d: %d\n",counter,sum);                           
       counter++; 
       data--;
                 
   }
   
  system("pause");
  return 0;
}

acm 10696: f91

[心得] //0.091

#include <stdio.h>

 
int f91( int a)
{
  if(a<=100)
   {
      return f91(f91(a+11));
   }
  else
  {
   
     return (a-10);
  } 
  
}

int main()
{
  int a,b;
 
  while(scanf("%d",&a)==1)
  {
                         
     if(a==0)   
      break;
       b=a;
       b=f91(b);
       printf("f91(%d) = %d\n",a,b);
                     
  }
      
  system("pasue");
  return 0;
    
}

C acm10673 Play with Floor and Ceil

對任何2個整數 x 和 k,存在另2個整數 p 和 q 使得:

要證明上面的式子是一件相當容易的事,所以我們不會要求你去做。我們要你做的事甚至更容易一些。給你 x 和 k 的值,請你找出 p 和 q 使得上面的式子成立
對每組測試資料輸出一列,含2個整數 p 和 q 。假如存在不只一組答案,輸出任何一個都可以。

 [心得] 0.340

1. % (mod)只能用int ,所以變數宣告為double,運算時必須type casting 成int 型態
2. Solution
  
CASE:(整除) 
  中floor 和ceiling 相同(表示x/k可整除),
     ==> 等號兩邊同乘k
  ==> kx= px+qx;
     ==> k=p+q; (最簡單的方式,令p為0, k=q)


CASE : (差 1)
  中floor 和ceiling差1,
  最簡單的解,令p=-x, q=x;

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

int main()
{
  long int x,k,p,q;
  int i,n;

  scanf("%d",&n);
  while(n)
  {
    
     for(i=0;i<n;i++)
     {
        scanf("%ld %ld",&x,&k);
        if( (int)x%(int)k ==0)
        {
            p=0; q=k;
        }
        else /*floor(x/k) ceil(x/k) 差 1*/
        {    
           p=(0L-x);
           q=x;
        }
        printf("%ld %ld\n",p,q);               
     }
     n--;              
 
  } 
  system("pause");
  return 0;   
}

2012年1月10日 星期二

acm 10589 Area

[心得]  0.096

1.一開始就有注意到 int 最好不要和 浮點數比較的問題,所已全部變數宣告成double
   這樣在DEV C++裡雖然答案是對的 但是送上去會得到WA,所以只好參考網路上別人的答案把int 運算都 type casting 成double,才AC!
2.每個點與ABCD 的距離都小於半徑!



#include <stdio.h>


int main()
{
  
   int a,n;
   while(scanf("%d %d",&n,&a)==2)
   { 
      if(n==0 &&a==0)
         break;            
      int i,counter=0;            
      double x,y;
      for(i=0;i<n;i++)
      {
          scanf("%lf %lf",&x,&y);
          if((x*x)+(y*y)<= (double)a*a&&
             (a-x)*(a-x)+(y*y)<=(double)a*a&&
             (a-x)*(a-x)+(a-y)*(a-y)<=(double)a*a&&
             (x*x)+(y-a)*(y-a)<=(double)a*a)
             counter++;
             
      }
     
      printf("%.5lf\n",((double)counter/(double)n*(double)a*(double)a));             
   }
    return 0;
}

2012年1月9日 星期一

acm 10550 Combination Lock

[心得] 0.008
1.順時針轉鎖,但是實際上轉盤是逆時針轉
   假設輸入a b c d四個數字:
  a->b 是順時鐘轉, (轉盤實際是逆時針轉)
           case : a>b (a-b)*9
           case :a<b  (40-b+a)*9

  b->c 是逆時針,(轉盤實際是順時針轉)
           case : b>c (40-b+c)*9
           case:  b<c (b-c)*9
  c->d 同 a->b

#include <stdio.h>

int angle(int x,int y)
{
    if(x<y)
       return((40+x-y)*9);
    else
       return ((x-y)*9);
}


int angle_rev(int x,int y)
{
    if(x<y)
       return ((y-x)*9);
    else
       return((40-x+y)*9); 
}
int main()
{
  int a,b,c,d;
 
  while( scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF)
  {
     int angle_a=1080;   
    if(a==0&&b==0&&c==0&&d==0)
      break;
    
    angle_a+=angle(a,b)+angle_rev(b,c)+angle(c,d); 
    printf("%d\n",angle_a); 
 
  }   
  system("pause");
  return 0;   
}

acm 10499 The Land of Justice

[心得] 0.036
球體表面積公式為 4*π*R*R
1.如果切成 一半,可以想像多兩個大圓面積 為2*(R*R*π)
    ==>2*(R*R*π) /4*π*R*R =50%
 2.如果球體等分成3塊, 表面積會多 6*(1/2*R*R*π)  (想像每個切面都是1/2個大圓面積)
    ==>3*(R*R*π) /4*π*R*R =75%
 3.如果球體等分成3塊, 表面積會多 8*(1/2*R*R*π)
    ==>4*(R*R*π) /4*π*R*R =100%



#include <stdio.h>

int main()
{
   long long int number;
   while(scanf("%lld",&number)!=EOF)
   {
      if(number <0)
         break;                            
      if(number == 1) 
         printf("0%%\n");
      else
         printf("%lld%%\n",25*number);          
   }
  system("pause");
  return 0;
}

acm 10473: Simple Base Conversion

 [心得] :0.012
1.題目說這個數10進位的值一定小於 231 
   所以可以用2的31次方數值試看看
 2.用long long int宣告 scanf 記得用%lld

3. (網路上別人寫的文章)
字串轉數字
int nValue;
float fValue;
CString szValue = "224";
sscanf(szValue,"%d",&nValue);
szValue = "5.82";
sscanf(szValue,"%f",&fValue);
以上為sscanf()的用法
第一個參數為我們所要轉換的字串
第二個參數則是該字串的格式 如果我們要將他轉成整數 則裡面就是"%d"
如果是要轉浮點數 裡面就是"%f"
轉好的結果就會放在第三個參數所指的位置裡面
特別要注意 第三個參數是要傳入指標 不是傳入數值

#include <stdio.h>

int main()
{
   char a[4000];
   long long int number;
   while(gets(a)!=NULL)
   {
     if(a[0]=='-') break;
    
     if(a[1]=='x')
     {
       sscanf(a,"%x" ,&number),
       printf("%lld\n", number);  
     }
     else
     {
        sscanf(a ,"%lld" ,&number),
        printf("0x%X\n", number);  
     }        
   }
  system("pause");
  return 0;
}