1. 程式人生 > >acm入門練習心得

acm入門練習心得

A題  兩數相加等於n相乘等於m 問是否存在兩數

寫了超級久沒有寫出來,因為我的思路是 把m的因子都找出來,加加看,看等不等於n。後來發現m的因子還要考慮負數的情況,還要考慮m是不是負數的情況。太過麻煩,顯然出錯了。

實際上,可以用較為簡單的方法,來解這個二元方程有沒有整數解即可。最後只需要判斷一個一元二次方程有沒有整數解即可。

判斷這個解是不是整數的方法可以是: if((y-(int)y)==0)

D題 找到只出現奇數次的數

這是在新學了STL以後寫的,之前考慮的演算法是用二重迴圈,但是顯然會超時。於是想到了用STL裡的sort函式。建立了一個數組儲存了所有的資料以後,使用sort函式,然後迴圈判斷這個數和之後的數是否相等,由此計算這個數的個數,找到奇數的情況就輸出。特殊情況是陣列的最後一個,所以先判斷是否已經到了最後一個。

一次性A了很開心

這道題和校賽的毒姐的情侶裝很類似,當時也沒寫出來,應該還可以用異或來判斷。之後可以再考慮怎麼寫。

E題 只取一個數的後兩位做加法運算

挺簡單的一題,就用%=就可以了

F題 一個數十進位制的各位之和等於十六進位制的各位之和等於十二進位制的各位之和

用一個temp來儲存這個數,對這個數%10/10直到他不等於0(十六十二進位制同理)求得這三個進位制各位數相加之和

G題 找到把一個10000以內的偶數拆分成兩個不同的素數的不同拆分方法的次數

想到每次判斷小於這個偶數的素數,但是顯然太麻煩了,考慮到偶數在10000以內,就百度了10000以內的素數表,存在了數組裡。

迴圈判斷是否有兩個相加等於這個偶數

本來的寫法是

for(j=0;j<1229&&j!=i;j++)
{
if (other ==prime[j]&&j!=i)
cnt++;
}
 
}
printf("%d\n",cnt);

原意是想把j從0到1228都判斷一下,然後排除等於i的情況,在把cnt/2輸出

但是發現這樣想第一個問題是j判斷到i就結束了

經zcx提醒,發現其實確實只用判斷到i就可以了,這樣的話cnt也不用/2

H題 一個整數不知道最後兩位數,知道它可以被某數除盡,算這個數最後兩位可能是什麼

前面的結果算出來挺容易的,難的是題目的要求是,每個數之後有一個空格最後一個數之後沒有空格,這個問題其實挺常見的之前有一題也是這個原因

這樣的話就不能直接迴圈的時候加入空格了

方法是:用一個flag先定為0,輸出第一個數之後改為1,之後每次輸出數字之前加一個空格。

還有一個要注意的問題是當這個數小於10時前面要用0補足

I題 算出第n各斐波那契數

本來想用一個函式做遞迴,但是超時了。改成迴圈以後就不會超時了。

因為之後數字變得很大,所以要用到longlong。

J題 找到最高的人

很簡單,就找最大值就好了。

N題 a能否被b整除

很簡單,略。

R題 計算座標上兩個點與原點相連的夾角大小

用向量中計算cos的做法,算出cos。再用acos()函式算出角度,因為acos()函式返回值是弧度制,所以要*180/3.1415826

錯誤出現在,這兩個點的座標是實數

S題 輸入11位手機號,以6+最後五位作為短號

定義了一個數組,儲存這11位數字

然後輸出6,再從i=6開始迴圈輸出剩下的數

感想:感覺自己有的時候寫題目非常糙,都是沒考慮清楚細節亂來。經常不夠耐心,都還沒有除錯就隨便提交程式碼。

師陽大神實在是很厲害,他都是哪裡來的這麼多時間A題的

在俱樂部的一週,覺得自己腰痠背痛,特別困特別累餓的特別快。感覺腦子都不太好用了,非常擔心自己頭髮要掉光了,所以趕緊買了點堅果補一下...