สมมติว่าเรามีจำนวนเต็มอาร์เรย์ เราต้องหาผลรวมของตัวหารของจำนวนเต็มในอาร์เรย์นั้นที่มีตัวหารสี่ตัวพอดี ดังนั้นหากไม่มีจำนวนเต็มดังกล่าวในอาร์เรย์ ให้คืนค่า 0 ตัวอย่างเช่น หากอินพุตเป็น [21, 4, 7] ผลลัพธ์จะเป็น 32 เนื่องจาก 21 มีตัวหารสี่ตัว 1, 3, 7, 21 4 มีตัวหารสามตัว 1, 2, 4 และ 7 มีตัวหารสองตัว 1 และ 7 คำตอบคือผลรวมของตัวหารของ 21 เท่านั้น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า ok() ซึ่งจะใช้ x เป็นอินพุต
-
ret :=1 + x, cnt :=2
-
สำหรับ i :=2, i^2 <=x, เพิ่ม i ขึ้น 1
-
ถ้า x หารด้วย i ลงตัว
-
เพิ่ม ret โดย i เพิ่ม cnt โดย 1
-
ถ้าฉันไม่ใช่ x/i ให้เพิ่ม cnt ขึ้น 1, ret :=ret + (x/i)
-
-
-
return ret ถ้า cnt เป็น 4 มิฉะนั้นให้คืนค่า 0
-
จากวิธีหลัก
-
ret :=0, n :=ขนาดของ nums
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
ret :=ret + ok(nums[i])
-
-
รีเทิร์น
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int ok(int x){ int ret = 1 + x;; int cnt = 2; for(int i = 2; i * i <= x; i++){ if(x % i == 0){ ret += (i); cnt++; if(i != x / i){ cnt++; ret += (x / i); } } } return cnt == 4 ? ret : 0; } int sumFourDivisors(vector<int>& nums) { int ret = 0; int n = nums.size(); for(int i = 0; i < n; i++){ ret += ok(nums[i]); } return ret; } }; main(){ vector<int> v = {21,4,7}; Solution ob; cout << (ob.sumFourDivisors(v)); }
อินพุต
[21,4,7]
ผลลัพธ์
32