# Math# Number Theory# Square Root# Simplification

d085 - 根號運算

🔗 前往 ZeroJudge 原題

題目描述

題目要求輸入一串數字,對於每個數字計算其平方根,並將結果簡化輸出。如果平方根是整數,則直接輸出整數。如果平方根不是整數,則將其表示為 a√b 的形式,其中 a 是平方根中可以提取的最大平方因子,b 是提取平方因子後的剩餘因子。如果輸入為負數,則在結果中加入 i

解題思路

程式碼首先讀取輸入的數字 a。如果 a 是負數,則將其轉換為正數,並在簡化平方根後在結果中加入 i。然後,程式碼迭代從 2 到 sqrt(a) 的所有數字,檢查是否可以從 a 中提取平方因子。如果可以,則將 a 除以該平方因子,並將 b 乘以該因子的平方根。最後,程式碼根據 b 的值輸出簡化後的平方根。如果 b 為 1,則輸出空值。如果 a 為 0 或 1,則直接輸出 a

複雜度分析

  • 時間複雜度: O(sqrt(n)),其中 n 是輸入數字的大小。因為迴圈迭代到 sqrt(a)。
  • 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。

程式碼

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int a;
	while(cin >> a){
		if(a<0){
			a*=-1;
			int b=1;
			for(int i=2;i<=sqrt(a);i++){
				if(a%(i*i)==0){
					a/=i*i;
					b*=i;
					i=1;
				}
			}
			if(b!=1){
				cout << b;
			}
			if(a!=1)
			cout << "_/" << a << "i\n";
			else
			cout << "i\n";
		}
		else if(a==0||a==1){
			cout << a << "\n";
		}
		else{
			int b=1;
			for(int i=2;i<=sqrt(a);i++){
				if(a%(i*i)==0){
					a/=i*i;
					b*=i;
					i=1;
				}
			}
			if(b!=1){
				cout << b;
			}
			if(a!=1)
			cout << "_/" << a << "\n";
			else
			cout << "\n";
		} 
	}
}

Discussion