[心得] 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;
}
2012年1月11日 星期三
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;
}
#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;
}
要證明上面的式子是一件相當容易的事,所以我們不會要求你去做。我們要你做的事甚至更容易一些。給你 x 和 k 的值,請你找出 p 和 q 使得上面的式子成立
對每組測試資料輸出一列,含2個整數 p 和 q 。假如存在不只一組答案,輸出任何一個都可以。
[心得] 0.340
1. % (mod)只能用int ,所以變數宣告為double,運算時必須type casting 成int 型態
2. Solution
CASE:(整除)
==> 等號兩邊同乘k
==> kx= px+qx;
==> k=p+q; (最簡單的方式,令p為0, k=q)
CASE : (差 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;
}
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;
}
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;
}
球體表面積公式為 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;
}
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;
}
訂閱:
文章 (Atom)