Posts

zerojudge d060: 還要等多久啊?

 zerojudge d060: 還要等多久啊? 解法大全: 關係運算子: (60 - (mins + 35) % 60) % 60 a=a-60; a=25-a; a=a%60; 布林比較: (n<25)*(25-n)+(n>25)*(60+25-n); 三元運算子: ?: 判斷式:if 內建巨集: isless(),isgreater() 詳見: d058.  BASIC 的 SGN 函數   或 http://www.cplusplus.com/reference/cmath/isless/

zerojudge d058 BASIC 的 SGN 函數

 zerojudge d058 BASIC 的 SGN 函數 解法大全: 判斷式:if 三元運算子: ? : 定義: sgn(n)=n/abs(n); 布林代數比較:cin>>v; (v>0-v<0) 內建巨集(其實它用的是布林比較): 注意:使用他們請先用cmath(math.h)標頭檔 詳見: http://www.cplusplus.com/reference/cmath/isless/ isless(),isgreater(),isequal(),islessgreater()...etc isless(n,0):n<0 isgreater(n,0):n>0 程式碼如下: int sgn (T n) { return (n> 0 )-(n< 0 ); } AC   (3ms, 324KB) # include <cmath> int sgn ( int n) { return isgreater(n, 0 )-isless(n, 0 ); } AC   (2ms, 324KB)

zerojudge a010. 因數分解

 zerojudge a010. 因數分解 可惜沒有辦法畫好圖,不然會更好理解解法 解法大全: 建表(真的只能建表因為有次方問題,無法直接印) 1.直接存質數          輸出時判斷該數字出現幾次          可以連續的判斷   如:2 2 2 2 2 5                           | |            if (arr[i]==arr[i+ 1 ]) index++;   或分開的判斷   如:2 2 2 2 2 5                       |        |           if (arr[i]==arr[i+index ])                                         index++;                執行資訊: AC   (5ms, 344KB)    2.存各個數字頻率           執行資訊: AC   (7ms, 4.1MB)   3.存質數頻率搭配質數表               先建質數表           ...

zerojudge c638 天干地支

 zerojudge c638 天干地支 解題思路: 跟c636一樣 1.switch case 2.建表 不過我是建兩個表,輸出兩次 一個表示天干,一個表示地支 當然可以只建一個表,哈哈 注意事項: 1.同c636第2點 要寫 tab1[(num-1904%10)%10]; 不能 tab1[(num-1904)%10]; 因為會取超出陣列範圍而輸出亂碼 2.跟c636第3點一樣,至少要用 4位置 年份: 1904年:甲X 1900年:X子

zerojudge c636.十二生肖

 zerojudge c636.十二生肖 解題思路: 1.switch case 2.建表 注意事項: 1. 沒有民國0年 ,所以-100到-1年要加1     2.取陣列的第負數個或超過你當初給的範圍會出現SEG ERROR:core dumped. 如: int table[13]; cout<<table[-1];  cout<<table[13]; 而且陣列是從第0開始,所以要當你輸入12的倍數(包括但不限於)(假設為12K K為正整數)會是負1(因為12K%12-1=-1),這時要加12 如果下面的程式碼看不懂(不包括註解後文字),代表你要理解判斷符號會傳回布林值(假(0)或真(1)) 如下:                             num=num+(num<= 0 );//same as if(num<=0)num++; num=(num% 12 ) -1 ; num=num+ 12 *(num< 0 );// n=num<0; means that if num<0,n=1 . Else,n=0;                              //same as if(num<0)num+=12; 3.一個中文字至少占 4空間 (經過不斷的測試) X:char table[12][3]; O:char table[12][4];

zerojudge c561. Bert 愛搗蛋

 zerojudge c561. Bert 愛搗蛋 解法大全: 思路的大方向: 1.先選答案,再翻轉 優點:省時間(只要翻轉一次) 缺點:較不直覺,較難寫 答案要先比位數,再比末位數大小 先取位數較多的,再取末位數大的 其方法有:  a.排序: 用內建sort搭配自寫的cmp函式 sort語法: sort(s,s+n,cmp); 重要的是自寫cmp函式 自己寫的參考程式碼: typedef struct obj { int len; string s; char c; obj( string a){s=a,len=s.length(),c=s[len -1 ];} }OBJ; int cmp ( string s1, string s2) { OBJ obja (s1) , objb (s2) ; if (obja.len==objb.len) { if (obja.c==objb.c) return 0 ; else if (obja.c<objb.c) return 1 ; else return -1 ; } return obja.len-objb.len; } 註:在自訂測資中答案是正確的,但在正式測資時會出現NA(有時是SEGERROR,有時是答案錯誤) b.直接選: /* DATE:2020/08/20 zerojudge c561 Version:3 status:not complete yet */ #include <iostream> using namespace std; #include <string> #define RE_C 1 int cas=0,ti=1; void check() { #ifdef RE_C==1 cout<<cas<<"er"<<ti++<<endl; #endif } typedef struct obj { int len; int last_digit; int big; string s; obj(){big=1;} void setdigit(){len--;la...

zerojudge b538: 分數運算-2

          zerojudge  b538:  分數運算-2 題意: 計算兩分數 輸入: 多組測資,以EOF結束 每組測資有 a,b,c,d 和@(四則運算中的一個運算子(+,-,*,/)) 輸出: 列印#e/f, 其中a/b @ c/d =  #e/f, 其中#為負號或""(如:不可列印出5/-3) 其中e,f>0,e/f為最簡分數 ,當f為1,只能列印出e ,當e等於0時請列印出0 測資輸入:  1 3 1 3 + 1 3 1 3 * 1 3 1 3 / 1 3 1 3 - 1 3 2 3 + 2 3 1 3 / 1 3 2 3 - 1 3 0 3 * 測資輸出://為備註 2/3 1/9 1 //不為1/1 0 //不為0/3 1 //不為1/3 2 //不為2/1 -1/3 //不為1/-3 0 //不為0/9 解法: 用通分算出e/f然後將e/f約分 我的方法是先讓分母為b*d而不是LCM(b,d);反正最後要約分 註:不可用浮點數算會有誤差