在 C++ 中打印要移除的数字位置以使数字可被 6 整除
在这个问题中,我们给定一个数字,我们必须从数字中移除多个数字,以便移除后形成的新数字可以被 6 整除。
让我们举个例子来更好地理解这个概念:
Input : 1324 Output : 4
**说明**:移除第 4 个数字后,我们将得到 132,它可以被 6 整除。
在这里,我们给定一个数字,我们必须返回移除数字的位置,以使其可以被 6 整除。
为了解决这个问题,我们将尝试创建一个解决问题的逻辑。为此,我们将使用我们的知识:如果一个数字可以被 2 和 3 整除,那么它也可以被 6 整除。
从数字中移除数字后,将检查新形成的数字是否可以被 6 整除,即同时被 2 和 3 整除。
方法
根据数字,我们可以找到移除一个数字后产生的数字是否可以被 6 整除。如果我们查看数字的最后一位数字,就会出现两种情况。
最后一位数字是奇数时
当最后一位数字是奇数时,唯一可能的方法是移除最后一位数字。只有当最后一位数字之前的数字是偶数时,新数字才不能被 6 整除。否则,则无解。
最后一位数字是偶数时
如果最后一位数字是偶数,我们必须找到数字除以 3 的余数。并根据这个数字,我们可以检查可以移除哪个数字。
将数字除以 3 有三种情况:
**余数为 1**:如果除法的余数为 1,则可以从数组中移除任何数字 1、4、7。如果有多个数字可以移除,我们将移除数字的方式是使移除后形成的数字最大。
**余数为 2**:如果除法的余数为 2,则可以从数组中移除任何数字 2、5、8。如果有多个数字可以移除,我们将移除数字的方式是使移除后形成的数字最大。
**余数为 0**:如果除法的余数为 0,则可以从数组中移除任何数字 3、6、9。如果有多个数字可以移除,我们将移除数字的方式是使移除后形成的数字最大。
基于这些,让我们解决一些问题并找到所需的输出:
最后一位数字是奇数时
1. 34241341
在这种情况下,唯一可以移除的数字是从最后一位移除的 1,形成的数字将是 3432134,它可以被 6 整除。因此,我们将返回移除的 1 的位置,即 8。
2. 3214241
在这种情况下,唯一可以移除的数字是从最后一位移除的 1,形成的数字将是 341224,它不能被 6 整除。因此,我们将返回 -1。
最后一位数字是偶数时
1. 8097860
在这种情况下,我们需要将数字除以 3 并找到余数,余数等于 2。因此,如果余数为 2,我们可以从数字中移除 2、5、8。因此,可以移除第 1 位的 8 和 5 以使数字可被 2 整除。我们将从第 5 位移除 8,因为如果从第 1 位移除它,将返回一个较小的数字。形成的新数字将是 809760,它可以被 6 整除。因此,我们将返回 5。
示例
基于此逻辑,让我们创建一个程序来解决这个问题:
#include <bits/stdc++.h> using namespace std; void isDivisibleBy6(string num){ int n = num.length(); int a[n]; int sum = 0; for (int i = 0; i < n; i++) { a[i] = num[i] - '0'; sum += a[i]; } if (a[n - 1] % 2){ if ( (a[n - 2] % 2 != 0) || (sum - a[n - 1]) % 3 != 0) { cout << "-1" << endl; } else { cout << n << endl; } } else { int re = sum % 3; int del = -1; int flag = 0; for (int i = 0; i < n - 1; i++) { if ((a[i]) % 3 == re) { if (a[i + 1] > a[i]) { del = i; flag = 1; break; } else { del = i; } } } if (flag == 0) { if (a[n - 2] % 2 == 0 and re == a[n - 1] % 3) del = n - 1; } if (del == -1) cout << -1 << endl; else { cout << del + 1 << endl; } } } int main(){ string number = "343224152"; isDivisibleBy6(number); return 0; }
输出
5