Problem Description
X在大家的幫助下終于找到了一個妹紙,于是開始了漫漫的追求之路,那么大家猜一猜X能不能追的上呢?
X初始對妹紙有一個心動值,妹紙對X有一個好感值,在追求時發生的的一系列事件中,當X對妹紙的心動值大于等于100,并且妹紙對X的好感值也大于等于100時,X就追上了妹紙,并且不會因為以后兩個值低于100的情況而分手,
事件1:兩個人一起吃飯,那么心動值和好感值都增加5
事件2:兩個人一起逛街,那么心動值和好感值都增加10
事件3:如果X給妹紙買了禮物,那么心動值減少5,好感值增加10
事件4:如果妹紙給X買了禮物,那么心動值增加20,好感值減少5
那么我們猜一猜吧,
Input
第一行輸入n(n < 100),表示發生了n個事件,
之后的n行,每行一個字符,表示事件i發生了,(事件1的代號A,事件2的代號B,事件3的代號C,事件4的代號D)
最后一行,輸入兩個整數k1,k2(0 < k1 < 100 && 0 < k2 < 100),k1表示X對妹紙的心動值,k2表示妹紙對X的好感值,
Output
輸出一行,
如果X追上妹子,那么輸出”happy!”,
否則,輸出”tiantai!” (不含引號) ,
Sample Input
4 A B C D 80 80
Sample Output
happy!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 int i,n,m,z,f=0; 8 char a[100]; 9 scanf("%d",&z); 10 getchar(); 11 for(i=0;i<z;i++) 12 { 13 scanf("%c",&a[i]); 14 getchar(); 15 } 16 scanf("%d %d",&n,&m); 17 for(i=0;i<z;i++) 18 { 19 if(a[i]=='A') 20 { 21 n=n+5; 22 m=m+5; 23 } 24 else if(a[i]=='B') 25 { 26 n=n+10; 27 m=m+10; 28 } 29 else if(a[i]=='C') 30 { 31 n=n-5; 32 m=m+10; 33 } 34 else if(a[i]=='D') 35 { 36 n=n+20; 37 m=m-5; 38 } 39 printf("%d %d\n",n,m); 40 if(n>=100&&m>=100) 41 { 42 f=1; 43 44 } 45 46 } 47 if(f==0) 48 { 49 printf("tiantai!\n"); 50 } 51 else printf("happy!\n"); 52 return 0; 53 }
非常簡單的一道題目,只需要注意字符輸入時規避回車的影響每次做完一件事就進行一次判斷就可以了
問題在于和我同學討論的程序中,發現他輸入字符的代碼是這樣的:
1 scanf("%d",&z); 2 getchar(); 3 for(i=0;i<z;i++) 4 { 5 scanf("%s",&a[i]); 6 }
這里對于字符的輸入,他使用了%s,而且不需要考慮回車的影響,這看起來是非常奇怪的;
事實上,由于后面是一個字符陣列,當使用%s時,會以&a[i]為首地址輸入一個字串 "X\0"(X為大寫字母),而在下一次輸入時,a[i+1]處儲存的'\0'就會被下一個字串的第一個字符覆寫,在這道題中不會產生影響,
在此程式中定義的字符陣列是足夠大的,所以不會產生其他影響,當定義的陣列大小為臨界值時,這種輸入方式就會因越界產生崩潰的可能,且當后面的變數為一個字符時,編譯器也不會報錯(CodeBlocks),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59753.html
標籤:C
