Posts

Showing posts from August, 2020

zerojudge d122. Oh! My Zero!!

 zerojudge d122. Oh! My Zero!! 千萬別用暴力解( 1a和2a的解法)!!,因為一定會TLE。 千萬別用2b!!,因為輸入很大(長整數),這樣字要用很大的記憶體,會出現錯誤(RE),我試過,真的。 解法大全: 1.依思路分: a)直接算階乘 b)算5法 2.建表 a)建階乘表 b)建5表 千萬別用暴力解( 1a和2a的解法)!!,因為一定會TLE。 千萬別用2b!!,因為輸入很大(長整數),這樣字要用很大的記憶體,會出現錯誤(RE),我試過,真的。 思路: 數學歸納法 1. 首先,你要先了解10=2*5,且2出現的次數比5多 所以要算出現比較少的次數(5的次數) 2. 再來你得先寫兩個表格 分別為, a)5的倍數數字的質因數中有多少的5(5的倍數數字可以整除幾次5) 用數學式表示:n=k*5^m (k,m為正整數) b)輸入和輸出的關係 3. 找規律 我的解法: 先用這方式寫 2b)先建表(1~1000000中能被5整除的次數),在逐項加起來 # define PO 7 const int MX= pow ( 10.0 ,PO);//because n is too large // MX=pow(10.0,5); typedef long long int LLI; int five_n[MX]={ 0 }; void print ( int *, int ) ; void build () { //memset(five_n,0,sizeof(five_n)); for ( int i= 1 ;i<=PO;i++) { int n= pow ( 5.0 ,i); for ( int j=n;j<=MX;j+=n) { five_n[j]++; } } return ; } int deal (LLI n) { int sum= 0 ; for ( int i= 5 ;i<=n;i+= 5 ) { sum+=five_n[i]; } return sum; } RE   (SIGSEGV)   1b)算5法:就是輸入一個數字N,算N!可以被5除多少次...

zerojudge-a147: Print it all

  zerojudge-a147: Print it all difficulty: extremely easy (for beginners) Q: give a number "n", output 1 to n increasingly except for the modulus of 7. tips: use a nested loop a "while" loop for input a "for" loop for output.

zerojudge a799 適合新手看的超多解法

  zerojudge a799 正值國 題意:  如果一個數的絕對值。   解法1: 用數字型別讀取 整數用abs(),浮點數用fabs() 優點:簡單 缺點:無法處理大數 解法2: 用string型別讀取 用string 類別中的erase把負號弄掉 優點:可以處理大數 解法3: 用string或char陣列型別讀取 不要列印出負號即可,反正它只判斷結果 如下: string s; int i=0; cin>>s; if(s[i]=='-')i++; for(;i<s.length();i++){cout<<s[i];} cout<<endl; 優點:如果用char 陣列,不需用函式 缺點:程式碼較長,執行時較慢

zerojudge b367.翻轉世界

 zerojudge b367.翻轉世界 題意: 判斷一組二維陣列數字翻轉180度後,會部會跟原來的陣列一模一樣,即判斷該組陣列是不是 對角線對稱。 輸入: 第一行為T,代表有T組測資。 每一組測資有n,m,代表有n,代表有n行m列的陣列。 接下來有n*m個數字r(0<=r<=231-1) 輸出: 對於每個測資,判斷是否可以符合翻轉180度不會改變的圖形 是的話請輸出 go forward 否的話請輸出 keep defending  解法大全: 依陣列維度: 解法1:開二維陣列 (n行m列) 解法2:開一維陣列(n*m個) 因為一維陣列和二維陣列的判斷方式一樣 依型態: 解法1:用數字 解法2:用字串和reverse()函式 最好不要用字元,因為r最大到231-1 解法3:用STL <deque> 存入後,用front()和back()比較 deque <int>deq1; 如果deq1.front()!=deq1.back()代表不能翻轉 解法4:用STL<list> 同上 註:更多STL資訊你可以上網查

zerojudge d068. 該減肥了

 zerojudge d068. 該減肥了 解法大全: 1.判斷式 2.三元運算子 3.布林比較:      w=w-(w>50);     //same as w-=(w>50)     //not w=w-w>50;     //"-" has  higher priority to">" , this will always get 0     //more complex     w=(w<=50)*w+(w>50)*(w-1);

zerojudge d065: 三人行必有我師

 zerojudge d065: 三人行必有我師 這個最好用 陣列 解法大全: 判斷: 三元運算子: 內建函數: max() 用以下函數前要先引進<algorithm> max_element() 如下: #include <iostream> using namespace std; //#include <algorithm> //according to the version of compiler int main() { int arr[3];         cin>>arr[0];int MAX=arr[0]; for(int i=1;i<3;i++) { cin>>arr[i];                    MAX=max(arr[i],MAX); } cout<<MAX<<endl; return 0; } or #include <iostream> using namespace std; #include <algorithm> int main() { int arr[3]; for(int i=0;i<3;i++) { cin>>arr[i]; } int MAX= *max_element(arr,arr+3); cout<<MAX<<endl; return 0; } 注意: 引進 <algorithm>時,可以不用引進<iostream>,如下: # include <cstdio> using namespace std ; # include <algorithm> int main () { int arr[ 3 ]; for ( int i= 0 ;i< 3 ;i++) { scanf ( "%d" ,&arr[i]); } int MA...

zerojudge d063. 0 與 1

zerojudge d063. 0 與 1 題意:若輸入0輸出1,若輸入1輸出0 解法大全: 判斷式: 三元運算子 布林代數:! n=!n; n= not n; n=n^1 (n^=1) n= n xor 1 布林代數比較: n=(n!=1) n=(n==0); n=(n<1); 式子: 求經過(1,0)和(0,1)的點 ans: 1)y=-(x-1); 2)y=(x-1)*(x-1); 3)y=| x-1|; [process and proof] 1)Let it be a linear equation(y=mx+b) replace the points (0,1) and (1,0). 0=1*m+b; 1=0*m+b; get m=-1,b=1; 2)Let it be a quadratic equation(y=a*x*x+b*x+c) replace the points (0,1) and (1,0). 1=a*0+b*0+c; 0=a*1+b*1+c; get c=1; which has infinitely many solution.(a*x*x-b*x=-1) the euation can be simplify y=(x-1)*(x-1); if a=1,b=-2; 3)according to 1),2) we can conclude that y=|x-1|; #end

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);反正最後要約分 註:不可用浮點數算會有誤差

zerojudge-b572忘了東西的傑克

zerojudge-b572 忘了東西的傑克 難度:簡單題 題意: 有天,下完資訊課回家的路上,傑克發現他不小心忘了東西在電腦教室,他想要回去拿,卻怕趕不上公車,請你寫一個程式判斷他要不要回去拿。 輸入: 第一行為數字N,代表底下有N行測資,接下來N行給你你目前時間H1 M1,與公車發車時間H2 M2,再給你從現在的地點回去電腦教室,再去公車站的時間 輸出:如果趕得及回去的話,請輸出Yes,否則請輸出No   解法: 我把小時和分鐘換成總時間