1. 程式人生 > 其它 >201912-1報數

201912-1報數

題目

題目連結:報數

這裡給出題目的截圖

思路

這個題目很簡單,我為什麼會寫上來呢?因為我真的很菜,做錯了好多次(無聲哭泣)。

那就來認真分析一下吧。

題目要求我們進行報數是吧,有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;
}

結語

哎,沒想到自己連這種基礎的題目也要寫那麼久,真的有一點心累了,看來這次認證是不能夠達到自己的目標了。努力去考吧,實在不如願的話來年再考一次。加油吧!