# Greedy# String# Simulation

c562 - Puyu 愛數論

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個函數 F(N),並提供幾個範例值。要求讀取多個數字 N,並輸出對應的 F(N) 值。觀察範例可以發現,F(N) 實際上是計算 N 的十進位表示中,數字 8 出現的次數乘以 2,再加上數字 9、6、0 出現的次數總和。

解題思路

題目要求計算一個函數 F(N) 的值,該函數的計算方式是基於輸入數字 N 的十進位表示。程式碼直接讀取輸入數字的每一個字元,並根據字元的數值來更新答案。如果字元是 '8',則答案加 2;如果字元是 '9'、'6' 或 '0',則答案加 1。當讀取到換行符或 EOF 時,輸出當前答案並重置答案。

複雜度分析

  • 時間複雜度: O(N),其中 N 是輸入數字的位數。因為程式碼需要遍歷輸入數字的每一個字元。
  • 空間複雜度: O(1),程式碼只使用了幾個整數變數來儲存答案和臨時值,空間使用量不隨輸入大小變化。

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
inline void write(int x) {
	if(x==0){putchar_unlocked('0');return;}
	int stk[9],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
	int ans=0;
	char a;
	while(a=getchar_unlocked()){
		if(a<'0'){
			if(a==-1)break;
			write(ans);
			putchar_unlocked('\n');
			ans=0;
		}
		else if(a=='8')
			ans+=2;
		else if(a=='9'||a=='6'||a=='0')
			++ans;
	}
}

Discussion