Java 最后一位:计算从0到9的数字是序列中元素的最后一位的多少倍

Java 最后一位:计算从0到9的数字是序列中元素的最后一位的多少倍,java,arrays,algorithm,Java,Arrays,Algorithm,我们得到两个数字a和n 按照以下顺序: [a^1, a^2, a^3.....a^n-1, a^n] [a, a2, a3, … an-1, an] 计算从0到9的数字是序列中元素的最后一个数字的多少倍 输入 [0:0,1:0,2:2,3:0,4:2,5:0,6:1,7:0,8:2,9:0] a=2,n=7 输出 [0:0,1:0,2:2,3:0,4:2,5:0,6:1,7:0,8:2,9:0] 因为序列的最后一位是[2,4,8,6,2,4,8] 我的方法是制作一个包含n,a[n]的数组

我们得到两个数字an

按照以下顺序:

[a^1, a^2, a^3.....a^n-1, a^n]
[a, a2, a3, … an-1, an]
计算从0到9的数字是序列中元素的最后一个数字的多少倍

输入

[0:0,1:0,2:2,3:0,4:2,5:0,6:1,7:0,8:2,9:0]
a=2,n=7

输出

[0:0,1:0,2:2,3:0,4:2,5:0,6:1,7:0,8:2,9:0]
因为序列的最后一位是
[2,4,8,6,2,4,8]

我的方法是制作一个包含n
a[n]
的数组,计算序列并存储在此数组中。制作另一个10的数组,o[10],其中每个元素都是0

现在从数组
a[n]
,对于每个元素,do
m=a[i]%10
,其结果将在数组
o[m]
中递增。假设我们做64%10,我们得到4。现在在索引4处增加数组的元素

这是正确的方法吗?我无法编写代码

在伪代码中:

for i in 1 to n
  v = a^i
  o[v % 10]++
end
if (a % 10 in [0, 1, 5, 6])
    return [a % 10: n]
else 
    if (a % 10 in [4, 9])
        c = n / 2
        r = n % 2
        counts = [a % 10: c, 10 - a % 10: c]
    else
        c = n / 4
        r = n % 4
        if (a % 2 == 0)
            counts = [2: c, 4: c, 6: c, 8: c]
        else
            counts = [1: c, 3: c, 7: c, 9: c]

    d = a % 10
    for i = 0; i < r; i++
        counts[d]++
        d = (d * a) % 10

    return counts

因为您只对最后一个数字感兴趣,所以只有
a
的最后一个数字是相关的,因为

(a * a) % 10 = ((a % 10) * (a % 10)) % 10
此外,根据
a
,最后的数字形成长度为
1
2
4
的重复模式。特别是:

  • 对于
    a%5
    0
    1
    0
    1
    5
    6
    ),相同的数字一直重复(
    0^n=0
    1^n=1
  • 对于
    a%5
    -1
    4
    9
    ),您将得到
    -1
    1
    mod 5
    )的交替模式。特别是,对于
    4
    而言,
    4
    6
    都出现
    n/2次。对于
    9
    ,这适用于
    1
    9
  • 对于
    [2,8]
    中的
    a%10
    [2,4,6,8]
    中的每个数字都出现
    n/4次
  • 对于
    [3,7]
    中的
    a%10
    [1,3,7,9]
    中的每个数字出现
    n/4次
在最后3种情况下,可能还有一些剩余部分。为此,您需要使用一个简单的算法,最多需要
10步。因此,这是一个
O(1)
时间算法(伪码):

if(在[0,1,5,6]中的%10)
返回[a%10:n]
其他的
如果(在[4,9]中为%10)
c=n/2
r=n%2
计数=[a%10:c,10-a%10:c]
其他的
c=n/4
r=n%4
如果(a%2==0)
计数=[2:c,4:c,6:c,8:c]
其他的
计数=[1:c,3:c,7:c,9:c]
d=a%10
对于i=0;i
最后一位数字是两个数字

按照以下顺序:

[a^1, a^2, a^3.....a^n-1, a^n]
[a, a2, a3, … an-1, an]
计算从0到9的每个数字是序列中元素的最后一个数字的多少次。
程序应接受文件名作为包含输入的参数。输入文件的每一行都包含一对整数
a
n

输入/输出规格

例如,以下输入:

a = 2, n=7
将产生以下输出:

0 : 0, 1 : 0, 2 : 2,3 : 0 ,4 : 2, 5 : 0, 6 : 1 ,7 : 0 , 8 : 2 , 9 : 0
因为序列的最后几位是
[2,4,8,6,2,4,8]

使用系统; 公共类候选代码 { 公共静态字符串lastdigit(int-input1,int-input2) { //在这里写代码 int a=输入1,n=输入2; int[]num=新的int[10]; 字符串输出=”;
对于(int i=0;i您可以通过

a1=数学功率(输入1,输入2);
b1=a1%10;

您实际上不需要存储序列,跟踪最后一位计数就足够了。除此之外,您似乎在正确的轨道上。为什么您不能对其进行编码?如果您有编码问题,请发布您尝试过的代码,并让我们知道您遇到的问题。p.S.如果
n
非常重要如果你不能计算a^n
,那么请记住,在你的序列中,只要你找到一个最后一位等于a%10的数字,这个模式就会重复,这是因为模运算的工作方式。但是我不会担心这个问题,除非你先把基本代码弄好。求幂。看起来你的结果是基数的倍数,而不是幂。幂的实际分布有点不同(例如,如果
a%10==5
,那么每个幂都以5结尾)。@ajb你完全正确。我把乘法和幂弄混了。我想我的编辑修复了这个问题。