201912-1報數
阿新 • • 發佈:2021-12-02
題目
題目連結:報數
這裡給出題目的截圖
思路
這個題目很簡單,我為什麼會寫上來呢?因為我真的很菜,做錯了好多次(無聲哭泣)。
那就來認真分析一下吧。
題目要求我們進行報數是吧,有7的或者是7的倍數的就要求跳過,最後統計出每個人跳過了多少次是吧。
既然只有四個人,那麼我們用一個4個長度陣列表示他們吧,開一個arr[4]
,然後陣列具體的值就是他們跳過的次數,為什麼可以這樣子呢?這個報數的過程其實是一個四個長度的迴圈,超過4之後又會回來了。也就是說,如果這個數是4的倍數的話,那就剛好會報道第四個人就會結束,那如果不是,那餘數就表示當前數是第幾個人報的。比如說餘數是3,那也就是說,要從頭開始報三個人,那剛好就是第三個人報完嘛!
如果報當前數字的人要跳過,我去餘數就知道他是第幾個人了嘛(餘數為0時表示是第4個人),這樣子就可以進行統計啦!也就是執行
arr[k%4]++;
假設當前報數為7,那麼我們取餘,得到3,說明7是第三個人應該報的數,但是他要跳過,所以就是在他的跳過次數上加1.
當然,題目還有另外一個考點啦,那就是怎麼判斷它是7的倍數或者出現了7呢?(我就錯在了這裡)
7的倍數很簡單了,對7取餘就行了。
然後就是數字含有7怎麼解決,我們採取將它的每一位取出來判斷,怎麼做呢?那就是不斷地除以10,比如說100除以10等於10,再除以10就等於1,就相當於把百位數字取出來了。
好,那講解就到這裡,看程式碼吧。
程式碼
/**< 報數 */ #include <iostream> using namespace std; bool have_seven(int x) { if (x % 7 == 0)return true; else { while (x) { if (x % 10 == 7)return true; x /= 10; } return false; } } int n; int arr[4]; int main() { cin >> n; int m = 1, k = 1; while (m <= n) { if (have_seven(k)) { arr[k % 4]++; } else m++; k++; } for (int i = 1; i <= 3; i++) { cout << arr[i] << endl; } cout << arr[0]; return 0; }
結語
哎,沒想到自己連這種基礎的題目也要寫那麼久,真的有一點心累了,看來這次認證是不能夠達到自己的目標了。努力去考吧,實在不如願的話來年再考一次。加油吧!