e628 - 10494 - If We Were a Child Again
題目描述
題目要求實作一個簡單的計算機,能夠處理整數除法和求餘數運算。輸入包含一個被除數 (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";
}
}
}