将数字变为4的倍数所需移除的最小位数


在本文中,我们将探讨一个有趣的计算问题——“将数字变为4的倍数所需移除的最小位数”。这个问题在编码竞赛和基于算法的面试中很常见,并且为提高解决问题的能力提供了极好的练习。

首先,让我们了解问题陈述:我们有一个数字,我们的任务是移除最少的数字,使得剩余的数字可以被4整除。

概念理解

该问题属于数论领域。需要理解的一个关键事实是,一个数字可以被4整除当且仅当由其最后两位数字组成的数字可以被4整除。这个事实对于解决我们的问题至关重要。

算法说明

解决此问题的算法涉及以下步骤:

  • 将数字转换为字符串。

  • 从字符串末尾检查由最后两个字符组成的数字是否可以被4整除。

  • 如果是,则返回已移除的数字个数。如果不是,则移除最后一个字符并递增计数。

  • 重复此过程,直到数字可以被4整除或只剩下一个数字。

示例

以下是算法的程序:

#include <stdio.h>
#include <string.h>

int minRemovals(char* num) {
   int n = strlen(num); // Get the length of the string
   int count = 0;

   for (int i = n - 1; i > 0; i--) {
      if ((num[i] - '0' + (num[i - 1] - '0') * 10) % 4 == 0) {
         return count; // Return the count if the number is divisible by 4
      }
      count++;
   }
   return n - 1; // If no divisible number found, return n - 1
}
int main() {
   char num[] = "1351";
   printf("Minimum number of digits to be removed to make the number divisible by 4 is: %d\n", minRemovals(num));
   return 0;
}

输出

Minimum number of digits to be removed to make the number divisible by 4 is: 3
#include<bits/stdc++.h>
using namespace std;

int minRemovals(string num) {
   int n = num.size();
   int count = 0;
   
   for (int i = n - 1; i > 0; i--) {
      if ((num[i] - '0' + (num[i - 1] - '0') * 10) % 4 == 0) {
         return count;
      }
      count++;
   }
   
   return n - 1;
}
int main() {
   string num = "1351";
   cout << "Minimum number of digits to be removed to make the number divisible by 4 is: ";
   cout << minRemovals(num) << endl;
   
   return 0;
}

输出

Minimum number of digits to be removed to make the number divisible by 4 is: 3
public class Main {
   public static int minRemovals(String num) {
      int n = num.length(); // Get the length of the string
      int count = 0;

      for (int i = n - 1; i > 0; i--) {
         if ((num.charAt(i) - '0' + (num.charAt(i - 1) - '0') * 10) % 4 == 0) {
            return count; // Return the count if the number is divisible by 4
         }
         count++;
      }

      return n - 1; // If no divisible number found, return n - 1
   }

   public static void main(String[] args) {
      String num = "1351";
      System.out.println("Minimum number of digits to be removed to make the number divisible by 4 is: " + minRemovals(num));
   }
}

输出

Minimum number of digits to be removed to make the number divisible by 4 is: 3
def min_removals(num):
   n = len(num)  # Get the length of the string
   count = 0

   for i in range(n - 1, 0, -1):
      if (int(num[i]) + int(num[i - 1]) * 10) % 4 == 0:
         return count  # Return the count if the number is divisible by 4
      count += 1

   return n - 1  # If no divisible number found, return n - 1


num = "1351"
print(
   "Minimum number of digits to be removed to make the number divisible by 4 is:",
   min_removals(num))

输出

Minimum number of digits to be removed to make the number divisible by 4 is: 3

在 minRemovals 函数中,我们初始化一个计数器 count 为 0,它将跟踪已移除的数字个数。然后,我们从数字(字符串)的末尾开始迭代,并检查由最后两位数字组成的数字是否可以被4整除。如果是,我们返回计数;如果不是,我们递增计数并继续下一次迭代。

main 函数作为我们程序的入口点,我们在这里定义输入数字并打印将数字变为4的倍数所需移除的最小数字个数。

测试用例示例

让我们以数字 1351 为例。当我们检查最后两位数字 (51) 时,我们发现它不能被4整除。因此,我们移除最后一位数字 (1),得到数字 135。我们再次检查并发现最后两位数字 (35) 仍然不能被4整除。因此,我们移除最后一位数字 (5),剩下数字 13。最后两位数字 (13) 不能被4整除,因此我们移除最后一位数字 (3)。现在,我们剩下数字 1,它不能被4整除,但我们不能再移除任何数字了。因此,需要移除的最小数字个数为 3。

时间和空间复杂度

算法的时间复杂度为 O(n),其中 n 是数字中数字的个数。空间复杂度为 O(1),因为我们在算法中没有使用任何额外的 数据结构。

结论

在本文中,我们深入探讨了一个常见的计算问题——确定将数字变为4的倍数所需移除的最小数字个数。我们开发了简洁的各种程序,利用了数论的关键见解。

更新于: 2023年10月27日

208 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告