给定一个数字,任务是检查一个数字是否可被16整除。输入数字可能很大,即使我们使用long long int,也可能无法存储。
例子:
Input : n = 1128
Output : No
Input : n = 11216
Output : Yes
Input : n = 1124273542764284287
Output : No
由于输入数字可能很大,因此我们不能使用n%16来检查数字是否可以被16整除,尤其是在C / C++之类的语言中。这个想法是基于以下事实。
A number is divisible by 16 if number formed
by last four digits of it is divisible by 16.
插图:
For example, let us consider 769616
Number formed by last four digits = 9616
Since 9522 is divisible by 16, answer is YES.
这是如何运作的?
Let us consider 76952, we can write it as
76942 = 7*10000 + 6*1000 + 9*100 + 5*10 + 2
The proof is based on below observation:
Remainder of 10i divided by 16 is 0 if i greater
than or equal to four. Note that 10000,
100000,... etc lead to remainder 0 when divided by 16.
So remainder of "7*10000 + 6*1000 + 9*100 +
5*10 + 2" divided by 16 is equivalent to remainder
of following :
0 + 6*1000 + 9*100 + 5*10 + 2 = 6952
Therefore we can say that the whole number is
divisible by 16 if 6952 is divisible by 16.
C++
// C++ program to find if a number
// is divisible by 16 or not
#include
using namespace std;
// Function to find that
// number divisible by 16 or not
bool check(string str)
{
int n = str.length();
// Empty string
if (n == 0 && n == 1)
return false;
// If there is double digit
if (n == 2)
return (((str[n-2]-'0')*10 +
(str[n-1]-'0'))%16 == 0);
// If there is triple digit
if(n == 3)
return ( ((str[n-3]-'0')*100 +
(str[n-2]-'0')*10 +
(str[n-1]-'0'))%16 == 0);
// If number formed by last four
// digits is divisible by 16.
int last = str[n-1] - '0';
int second_last = str[n-2] - '0';
int third_last = str[n-3] - '0';
int fourth_last = str[n-4] - '0';
return ((fourth_last*1000 + third_last*100 +
second_last*10 + last) % 16 == 0);
}
// Driver code
int main()
{
string str = "769528";
check(str)? cout << "Yes" : cout << "No ";
return 0;
}
Java
// Java program to find if a number
// is divisible by 16 or not
import java.io.*;
class GFG {
// Function to find that
// number divisible by 16 or not
static boolean check(String str)
{
int n = str.length();
// Empty string
if (n == 0 && n == 1)
return false;
// If there is double digit
if (n == 2)
return (((str.charAt(n-2)-'0')*10 +
(str.charAt(n-1)-'0'))%16 == 0);
// If there is triple digit
if(n == 3)
return ( ((str.charAt(n-3)-'0')*100 +
(str.charAt(n-2)-'0')*10 +
(str.charAt(n-1)-'0'))%16 == 0);
// If number formed by last
// four digits is divisible by 16.
int last = str.charAt(n-1) - '0';
int second_last = str.charAt(n-2) - '0';
int third_last = str.charAt(n-3) - '0';
int fourth_last = str.charAt(n-4) - '0';
return ((fourth_last*1000 + third_last*100
+ second_last*10 + last) % 16 == 0);
}
// Driver code
public static void main(String args[])
{
String str = "769528";
if(check(str))
System.out.println("Yes");
else
System.out.println("No ");
}
}
// This code is contributed by Nikita Tiwari.
Python3
# Python 3 program to find
# if a number is divisible
# by 16 or not
# Function to find that
# number divisible by
# 16 or not
def check(st) :
n = len(st)
# Empty string
if (n == 0 and n == 1) :
return False
# If there is double digit
if (n == 2) :
return ((int)(st[n-2])*10 +
((int)(st[n-1])%16 == 0))
# If there is triple digit
if(n == 3) :
return ( ((int)(st[n-3])*100 +
(int)(st[n-2])*10 +
(int)(st[n-1]))%16 == 0)
# If number formed by last
# four digits is divisible
# by 16.
last = (int)(st[n-1])
second_last = (int)(st[n-2])
third_last = (int)(st[n-3])
fourth_last = (int)(st[n-4])
return ((fourth_last*1000 + third_last*100
+ second_last*10 + last) % 16 == 0)
# Driver code
st = "769528"
if(check(st)) :
print("Yes")
else :
print("No")
# This code is conributed by Nikita Tiwari.
C#
// C# program to find if a number
// is divisible by 16 or not
using System;
class GFG {
// Function to find that number
// divisible by 16 or not
static bool check(String str)
{
int n = str.Length;
// Empty string
if (n == 0 && n == 1)
return false;
// If there is double digit
if (n == 2)
return (((str[n - 2] - '0') * 10 +
(str[n - 1] - '0')) % 16 == 0);
// If there is triple digit
if(n == 3)
return (((str[n - 3] - '0') * 100 +
(str[n - 2] - '0') * 10 +
(str[n - 1] - '0')) % 16 == 0);
// If number formed by last
// four digits is divisible by 16.
int last = str[n - 1] - '0';
int second_last = str[n - 2] - '0';
int third_last = str[n - 3] - '0';
int fourth_last = str[n - 4] - '0';
return ((fourth_last * 1000 + third_last * 100
+ second_last * 10 + last) % 16 == 0);
}
// Driver code
public static void Main()
{
String str = "769528";
if(check(str))
Console.Write("Yes");
else
Console.Write("No ");
}
}
// This code is contributed by Nitin Mittal.
PHP
输出:
No