素数整除性问题

作者: 郝以平 | 来源:发表于2017-12-11 23:00 被阅读133次

前几天遇到这么一道题,挺有趣的,分享给大家:

题目:

截图

题目的意思是:对于3的整除性,任何一个整数,如果各个位数相加能被3整除,那么这个数就能被3整除;对于11的整除性,任何一个整数,从右数每隔两位作为一个两位数进行分割,如果各个两位数相加能被11整除,那么这个数就能被11整除;是否所有的非2,5的素数p,都存在这样偏移位数r,使得分割后的数字之和能被p整除。

例如:
112321对11的整除性,
11+23+21 = 55
能被 55能被11整除,那么112321就能被11整除

很容易推导出下面公式:

任意整数X,可以表示为:
X = a0 + 10r * a1 + 102r * a2 + 103r * a3······
= a0 + a1 + a2 + a3·····+(10r-1) * a1+(10r-1) *(10r+1) * a2 +(10r-1) *(102r+10r+1) * a2······
其中an为r位整数。若(10r-1) 和( a0 + a1 + a2 ···)能被p整除,那X就能被p整除。

引入(纯循环小数)规律一:

假设 1/p为纯循环小数
1/p = k*(1/10n+1/102n+1/103n·····)
其中n为循环节长度;k是循环节,为n位整数。
=> (10n - 1) 1/p = k
=> (10n - 1) = pk

引入(非2 5 素数的倒数为纯循环小数)规律二:

假设1/p为混循环小数
1/p = k(1/10m+n+1/10m+2n+1/10m+3n·····)+t/10m
其中k为n位整数,t为m位整数,k不等于t
化简得p=10m(10n-1)/[k+(10n-1)t]
可知k只能被(10n-1)整除,设k=a*(10n-1),带入
p = 10m/(a+t)
=>p为素数只能取2或5
=> 1/p为纯循环小数,满足规律一。

可以得出结论

非2 5素数的倒数,一定存在整数r 、k,r为循环节长度,满足:
1/p = k/(10r-1)
=>p*k = 10r-1
其中k为纯循环小数循环节,长度为r

所以题目转化为求质数p的倒数的循环节长度:

import java.io.InputStreamReader;

/**
 * @author: hyp
 * Date: 2017-12-08
 */
public class Test {
    static class Expression {
        private int numerator;
        private int denominator;
        private int quotient;
        private int remainder;

        public Expression(int numerator, int denominator) {
            this.numerator = numerator;
            this.denominator = denominator;
            calculate();
        }

        private void calculate() {
            this.quotient = numerator / denominator;
            this.remainder = numerator % denominator;
        }

        public Expression next() {
            return new Expression(this.remainder * 10, denominator);
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof Expression)) return false;

            Expression that = (Expression) o;

            if (quotient != that.quotient) return false;
            return remainder == that.remainder;
        }

        @Override
        public int hashCode() {
            int result = quotient;
            result = 31 * result + remainder;
            return result;
        }
    }

    public static void main(String[] args) throws java.lang.Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        int value = Integer.parseInt(input);
        Expression cirlcePoint = new Expression(10, value);
        Expression point = cirlcePoint;
        int times = 1;
        while (!cirlcePoint.equals(point = point.next()) && times < value) {
            times++;
        }
        System.out.println(times);
    }
}

解决了从小就被告知的,各个位数相加和能被3整除那么这个数就能被3整除的原理,而且扩展到非2 5的所有素数,是不是很开心呢~~
证明可能有不严谨的地方,希望大家不吝赐教哦~

相关文章

  • 素数整除性问题

    前几天遇到这么一道题,挺有趣的,分享给大家: 题目: 题目的意思是:对于3的整除性,任何一个整数,如果各个位数相加...

  • 素数线性筛选

    素数线性筛选 素数的定义是除了1和自身能被整除外,没有其他数能被它整除。除此之外,1既不是素数,也不是合数。因此,...

  • 素数整除性质

    引言 这篇小文章介绍了算数基本定理的前置知识,也就是素数整除性质。 性质1的表述 如果素数,那么或。 性质1的证明...

  • Python测试解答

    第一题:求100以内的素数 素数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它...

  • Python 课程作业 0522 第一题

    第一题:求100以内的素数 素数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它...

  • Python测试题-爬取糗百文本和简书首页

    第一题:求100以内的素数 素数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它...

  • 学编程,你必须掌握的几种算法编程

    打印100以内的所有素数 首先解释一下什么是素数: 素数:只能被1 和自身整除的数 称为素数 也叫质数 其他的成...

  • 素数的判断

    5.4.1 素数的判断 存在整数a(判断其是否为素数) 如果存在一个正整数b可以整除素数a,即b是a的约数,那么必...

  • 【习题45】

    【程序45】题目:判断一个素数能被几个9整除

  • 你是如何求素数?

    素数:质数,又称素数,是只能被1或者自己整除的自然数。题目要求:求出 100 以内所有素数 1. 以前遇到这样的题...

网友评论

    本文标题:素数整除性问题

    本文链接:https://www.haomeiwen.com/subject/mggbixtx.html