如何检查大十进制数是否可以除以2 ^ x或5 ^ x

时间:2017-07-04 11:27:58

标签: algorithm division modulus

我有一个大的十进制数N(最多100.000位),我需要检查N是否可以2^X5^X ( 0 < X < 5 )

bignumber % (2^x) == 0

我能得到小费吗?我什么都不知道。

4 个答案:

答案 0 :(得分:8)

检查由最后x位数组成的数字。如果它可以除以2 ^ x,所有数字也可以。同样约5 ^ x。

原因是带有x最后零的十进制数总是可以除以2 ^ x或5 ^ x,因为它可以除以10 ^ x。所以,我们可以忘记起始数字,只检查最后的x。

检查可分性使用

[('animal', 'animal04'), ('animal', 'animal1'), ('animal', 'animal3')]
[('animal', 'bird'), ('animal', 'bird1'), ('animal', 'bird2'), ('animal', 'fish'), ('animal', 'insect'), ('animal04', 'animal1'), ('animal04', 'animal3'), ('animal04', 'bird'), ('animal04', 'bird1'), ('animal04', 'bird2'), ('animal04', 'fish'), ('animal04', 'insect'), ('animal1', 'animal3'), ('animal1', 'bird'), ('animal1', 'bird1'), ('animal1', 'bird2'), ('animal1', 'fish'), ('animal1', 'insect'), ('animal3', 'bird'), ('animal3', 'bird1'), ('animal3', 'bird2'), ('animal3', 'fish'), ('animal3', 'insect')]
[('bird', 'bird1'), ('bird', 'bird2')]
[('bird', 'fish'), ('bird', 'insect'), ('bird1', 'bird2'), ('bird1', 'fish'), ('bird1', 'insect'), ('bird2', 'fish'), ('bird2', 'insect'), ('fish', 'insect')]

答案 1 :(得分:0)

如果int sheetIndex = 0; DataSet ds = new DataSet(); public Form1() { InitializeComponent(); } private void btnImport_Click(object sender, EventArgs e) { var frmDialog = new System.Windows.Forms.OpenFileDialog(); if (frmDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { String constr = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""", frmDialog.FileName); OleDbConnection myConnection = new OleDbConnection(constr); myConnection.Open(); DataTable spreadSheetData = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string sheetName = ""; DataTable dt; OleDbCommand onlineConnection; OleDbDataAdapter theDataAdapter; // fill the "DataSet" each table in the set is a worksheet in the Excel file foreach (DataRow dr in spreadSheetData.Rows) { sheetName = dr["TABLE_NAME"].ToString(); sheetName = sheetName.Replace("'", ""); if (sheetName.EndsWith("$")) { onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "]", myConnection); theDataAdapter = new OleDbDataAdapter(onlineConnection); dt = new DataTable(); dt.TableName = sheetName; theDataAdapter.Fill(dt); ds.Tables.Add(dt); } } myConnection.Close(); scheduleGridView.DataSource = ds.Tables[0]; setLabel(); } } private void setLabel() { label1.Text = "Showing worksheet " + sheetIndex + " Named: " + ds.Tables[sheetIndex].TableName + " out of a total of " + ds.Tables.Count + " worksheets"; } private void btnNextSheet_Click(object sender, EventArgs e) { if (sheetIndex == ds.Tables.Count - 1) sheetIndex = 0; else sheetIndex++; scheduleGridView.DataSource = ds.Tables[sheetIndex]; setLabel(); } =&gt;很简单:)

0 < x < 5绝对是一个整数。 =&GT; X

您只需检查每个案例。 例如X = 1,2,3,4

您必须检查Bignumber%625 == 0

你知道X = 4 => 5^4 = 625 =&GT;如果这些10000 % 625 == 0号码除以4 =&gt;,请检查上一个4大号除以625

好吗?

答案 2 :(得分:0)

您面临两个问题:

  1. 如何存储大量数据。
  2. 如何计算该数字的除法并获得余数。
  3. 在计算机上存储这么大的数字是一项挑战。但任何数字都可以表示为多项式。

    var app = angular.module("Listt", []);
    
            app.controller(
                "ListtController",
            function ($scope) {
                $scope.results = {
                    response: [{
                        name: '',
                        surname: '',
                        age: ''
                    }]
                };
                $scope.searchListt = function () {
                    loadingAnimationStart();
                    $scope.results = getListt();
                    loadingAnimationStop();
                };
    
                function getListt() {
                    $scope.returnData;
                    $http.post(url, data, config).then(function (response) {
                     $scope.returnData = JSON.parse(response)
                    },function (response) {
                    alert("ERROR")
                    });
                }
            }
        );
    

    使用这个概念,人们可以很容易地使用多项式加法,减法,乘法和除法来计算非常大的值而没有精度损失。只需要设置多项式的系数,因此在打印数字时它们都是相同的符号。

    要在基数N到基数10打印数字存储,必须计算f,因此f(10)= g(N)。

    这个概念可以用大于10的数字进行优化,以减少计算时间,但是你需要记住31位×32位(乘法需要64位。负系数或系数大于你的基数可以是使用我们在手动进行算术运算时经常使用的相同进位/借位技术来减少。

    您可以开发自己的多项式库,处理循环和数学,或使用开源库,如GMP。

    关于多项式除法余数的一些信息:

    https://en.wikipedia.org/wiki/Polynomial_remainder_theorem

    我会选择使用GMP。

答案 3 :(得分:-1)

https://www.mathsisfun.com/divisibility-rules.html

当一个数字可以被整除时,应该列出。它适用于所有数字,无论多大。