📜  检查大数是否可被13整除

📅  最后修改于: 2021-04-26 08:30:51             🧑  作者: Mango

给定一个大数字,任务是检查数字是否可被13整除。
例子 :

Input :  637
Output : 637 is divisible by 13.

Input :  920
Output : 920 is not divisible by 13.

Input  : 83959092724
Output : 83959092724 is divisible by 13.

如果给定的数字num小,则可以通过执行num%13并检查结果是否为0来轻松查找是否可以被13整除。但是,非常大的数字呢?让我们讨论大量。
以下是关于13的可除性的一些有趣事实。

  • 如果并且如果从右到左的三个块的交替和(或相加和减去)也可以被13整除,则数字可以被13整除。例如,2911285可以被13整除,因为大小为3的块的交替和为2 – 911 + 285 = -650,可被13整除。
  • 当且仅当通过将最后一位数字乘以4所得的数字也可以除以13时,数字才能被13整除。
    例如,考虑2353。应用上述规则,我们得到235 + 3 * 4 =247。再次应用规则,得到24 + 7 * 4 =52。由于52可被13整除,所以给定数可被13整除。

以下是上面基于第一个事实的实现(查找大小为3的块的交替总和)

C++
// CPP program to check
// whether a number is
// divisible by 13 or not.
#include 
using namespace std;
 
// Returns true if number
// is divisible by 13 else
// returns false
bool checkDivisibility(string num)
{
    int length = num.size();
    if (length == 1 && num[0] == '0')
        return true;
 
    // Append required 0s .
    // at the beginning.
    if (length % 3 == 1)
    {
        // Same as strcat(num, "00");
        // in c.
        num +="00";
        length += 2;
    }
    else if (length % 3 == 2)
    {
        // Same as strcat(num, "0");
        // in c.
        num += "0";
        length += 1;
    }
 
    // Alternatively add/subtract
    // digits in group of three
    // to result.
    int sum = 0, p = 1;
    for (int i = length - 1; i >= 0; i--)
    {
        // Store group of three
        // numbers in group variable.
        int group = 0;
        group += num[i--] - '0';
        group += (num[i--] - '0') * 10;
        group += (num[i] - '0') * 100;
 
        sum = sum + group * p;
 
        // Generate alternate series
        // of plus and minus
        p *= (-1);
    }
    sum = abs(sum);
    return (sum % 13 == 0);
}
 
// Driver code
int main()
{
    string number = "83959092724";
    if (checkDivisibility(number))
        cout << number << " is divisible by 13.";
    else
        cout << number << " is not divisibe by 13.";
    return 0;
}


Java
// Java program to check
// whether a number is
// divisible by 13 or not.
 
class GFG
{
     
// Returns true if number
// is divisible by 13 else
// returns false
static boolean checkDivisibility(String num)
{
    int length = num.length();
    if (length == 1 &&
        num.charAt(0) == '0')
        return true;
 
    // Append required 0s .
    // at the beginning.
    if (length % 3 == 1)
    {
        // Same as strcat(num, "00");
        // in c.
        num +="00";
        length += 2;
    }
    else if (length % 3 == 2)
    {
        // Same as strcat(num, "0");
        // in c.
        num += "0";
        length += 1;
    }
 
    // Alternatively add/subtract
    // digits in group of three
    // to result.
    int sum = 0, p = 1;
    for (int i = length - 1; i >= 0; i--)
    {
        // Store group of three
        // numbers in group variable.
        int group = 0;
        group += num.charAt(i--) - '0';
        group += (num.charAt(i--) - '0') * 10;
        group += (num.charAt(i) - '0') * 100;
 
        sum = sum + group * p;
 
        // Generate alternate series
        // of plus and minus
        p *= (-1);
    }
    sum = Math.abs(sum);
    return (sum % 13 == 0);
}
 
// Driver code
public static void main(String[] args)
{
    String number = "83959092724";
     
    if (checkDivisibility(number))
            System.out.println(number +
                       " is divisible by 13.");
        else
            System.out.println(number +
                       " is not divisibe by 13.");
}
}
 
// This code is contributed by mits


Python 3
# Python 3 program to check whether a
# number is divisible by 13 or not
 
# Returns true if number is divisible
# by 13 else returns false
def checkDivisibility( num):
    length = len(num)
    if (length == 1 and num[0] == '0'):
        return True
 
    # Append required 0s at the beginning.
    if (length % 3 == 1):
         
        # Same as strcat(num, "00");
        # in c.
        num = str(num) + "00"
        length += 2
     
    elif (length % 3 == 2):
         
        # Same as strcat(num, "0");
        # in c.
        num = str(num) + "0"
        length += 1
 
    # Alternatively add/subtract digits 
    # in group of three to result.
    sum = 0
    p = 1
    for i in range(length - 1, -1 , -1) :
         
        # Store group of three
        # numbers in group variable.
        group = 0
        group += ord(num[i]) - ord('0')
        i -= 1
        group += (ord(num[i]) - ord('0')) * 10
        i -= 1
        group += (ord(num[i]) - ord('0')) * 100
 
        sum = sum + group * p
 
        # Generate alternate series
        # of plus and minus
        p *= (-1)
    sum = abs(sum)
    return (sum % 13 == 0)
 
# Driver code
if __name__ == "__main__":
    number = "83959092724"
    if (checkDivisibility(number)):
        print( number , "is divisible by 13.")
    else:
        print( number ,"is not divisibe by 13.")
 
# This code is contributed by ChitraNayal


C#
// C# program to check
// whether a number is
// divisible by 13 or not.
using System;
 
class GFG {
     
    // Returns true if number
    // is divisible by 13 else
    // returns false
    static bool checkDivisibility(string num)
    {
        int length = num.Length;
        if (length == 1 && num[0] == '0')
            return true;
     
        // Append required 0s .
        // at the beginning.
        if (length % 3 == 1)
        {
            // Same as strcat(num, "00");
            // in c.
            num +="00";
            length += 2;
        }
        else if (length % 3 == 2)
        {
            // Same as strcat(num, "0");
            // in c.
            num += "0";
            length += 1;
        }
 
        // Alternatively add/subtract
        // digits in group of three
        // to result.
        int sum = 0, p = 1;
        for (int i = length - 1; i >= 0; i--)
        {
            // Store group of three
            // numbers in group variable.
            int group = 0;
            group += num[i--] - '0';
            group += (num[i--] - '0') * 10;
            group += (num[i] - '0') * 100;
     
            sum = sum + group * p;
     
            // Generate alternate series
            // of plus and minus
            p *= (-1);
        }
        sum = Math.Abs(sum);
        return (sum % 13 == 0);
    }
     
    // Driver code
    static void Main()
    {
        string number = "83959092724";
         
        if (checkDivisibility(number))
                Console.Write( number +
                    " is divisible by 13.");
            else
                Console.Write( number +
                  " is not divisibe by 13.");
    }
}
 
// This code is contributed by Sam007


PHP
= 0; $i--)
    {
        // Store group of three
        // numbers in group variable.
        $group = 0;
        $group += $num[$i--] - '0';
        $group += ($num[$i--] - '0') * 10;
        $group += ($num[$i] - '0') * 100;
 
        $sum = $sum + $group * $p;
 
        // Generate alternate series 
        // of plus and minus
        $p *= (-1);
    }
     
    $sum = abs($sum);
    return ($sum % 13 == 0);
}
 
// Driver code
$number = "83959092724";
if (checkDivisibility($number))
    echo($number . " is divisible by 13.");
else
    echo($number . " is not divisibe by 13.");
 
// This code is contributed by Ajit.
?>


Javascript


输出 :

83959092724 is divisible by 13.