# Big Integer# Modulo Operation# Greedy

e628 - 10494 - If We Were a Child Again

🔗 前往 ZeroJudge 原題

題目描述

題目要求實作一個簡單的計算機,能夠處理整數除法和求餘數運算。輸入包含一個被除數 (n) 和一個除數 (m),以及一個運算符號 ('/' 或 '%')。對於除法運算,輸出商的個位數;對於求餘數運算,輸出餘數。被除數 n 可以是很大的數字,超出一般整數範圍。

解題思路

這題主要考驗對大數運算的處理能力。對於除法運算,我們需要模擬手動除法的過程,逐位計算商。由於只需要商的個位數,因此可以採用貪心策略,每次嘗試最大的個位數,直到無法繼續除下去。對於求餘數運算,我們只需要將被除數逐位讀取,並計算中間餘數,最後得到最終的餘數。由於題目限制被除數 n < 2^31,因此可以使用 long long 儲存。

複雜度分析

  • 時間複雜度: O(N),其中 N 是被除數的位數。
  • 空間複雜度: O(1),只需要常數級的額外空間。

程式碼

#include <iostream>
using namespace std;
string s,is;
long long m;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> s){
		cin >> is >> m;
		if(is=="/"){
			long long st=0,r=0;
			for(int i=0;i<s.size();++i){
				r*=10;
				r+=s[i]-'0';
				if(r<m){
					if(st){
						cout << "0";
					}
				}
				else{
					st=1;
					int j=1;
					for(;j<10;++j)
						if(m*j>r)break;
					cout << j-1;
					r-=(m*(j-1));
				}
			}	
			if(st==0)
				cout << st;
			cout << "\n";
		}
		else{
			long long ans=0;
			for(int i=0;i<s.size();++i){
				ans*=10;
				ans+=s[i]-'0';
				ans%=m;
			}
			cout << ans << "\n";
		}
	}
}

Discussion