`
yeshaoting
  • 浏览: 684285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

K尾相等数

    博客分类:
  • J2SE
 
阅读更多

 

K尾相等数

 

问题描述:

从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对"K尾相等数".请编一程序,输出M+N值最小的K尾相等数.

 

方式一(按我的思路写的,很糟糕的程序)

 

/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All rights reserved.
 * Author: Jarg Yee <yeshaoting@gmail.com>
 * http://jarg.iteye.com/
 */
import java.util.Scanner;
/*
 * 从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对"K尾相等数".请编一程序,输出M+N值最小的K尾相等数.
 * K尾相等数
 * 
 * 耗时较高
 */
public class EqualNumber
{
	public static void main(String[] args) throws Exception
	{
		final int thresholdValue = 1000;		//临界值1000

		System.out.println("输入一个自然数K(K>1):");
		Scanner s = new Scanner(System.in);

		int index = 0;		//最小幂index,可以看作找K尾相等数循环下界

		long k = s.nextLong();			//要求输入大于或等于2的整数
		if(k >= thresholdValue)
		{
			index = 1;
			k = (int)k%thresholdValue;		//若k是很大的整数,则会出现乘积会出现上溢的情况
											// 在数论基础知识里曾证明过(M*N)%R = (M%R *N%R)%R
											// 这样做的原因是避免后面进行乘运算时数据溢出
		}

		int m, n;
		long mRemainder, nRemainder;	//m,n次幂对应的余数
		

		/*
			@TODO 找出满足大于或等于1000的最小幂index,可以看作找K尾相等数循环下界
			由于2的10次幂结果为1024,所以找出最小幂index的循环上界为10
		*/
		if(index == 0)
			for(int i=1; i<=10; i++)
			{
				if((long)(Math.pow(k, i)) >= thresholdValue)
				{
					index = i;
					break;
				}
			}
		

		n = index;				//e.g. k = 2且n = 10时, k^n = 1024 > 1000
		m = index;				//e.g. k = 2且m = 10时, k^m = 1024 > 1000

		boolean flag = true;	//控制变量:跳出整个循环
		while(flag)
		{
			++m;		//因为,m>n条件,所以一开始m+1
						//每次迭代对于当前m值,没有合适的n值,得到"K尾相等数",则+1

			mRemainder = remainder(k, m, thresholdValue);	//获取m
			for(n=index; n<m; ++n)
			{
				nRemainder = remainder(k, n, thresholdValue);

				/*
					@TODO 找到结果后跳出整个循环
				*/
				if(mRemainder == nRemainder)
				{
					flag = false;
					break;
				}
			}
		}
		System.out.println("m:\t" + m + "\tn:\t" + n);
		System.out.println(k + "尾相等数:\t" + (m + n));

	}

	/*
		@TODO 求得余数
		因为幂操作很可能超出int,甚至long的最大可表示值,
		所以每步都求其余数,代替求乘积再求余数的做法.
	*/
	public static int remainder(long k, int num, int thresholdValue)
	{
		int value = 1;
		for(int i=0; i<num; i++)
		{
			value = (int)(value*k);
			value = value%thresholdValue;		//求余数
		}
		return value;
	}

}
 

 

 

---------- 运行Java ----------

输入一个自然数K(K>1):

123454321

m: 26 n: 1

321尾相等数: 27

 

输出完成 (耗时 0 秒) - 正常终止

 

 

 

 

方式二(网上的思路翻译成的Java程序)

http://blog.csdn.net/virtualxmars/article/details/2422836

/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All rights reserved.
 * Author: Jarg Yee <yeshaoting@gmail.com>
 * http://jarg.iteye.com/
 */
import java.util.Scanner;
/*
 * 从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对"K尾相等数".请编一程序,输出M+N值最小的K尾相等数.
 * K尾相等数
 * 
 * 空间耗费较高
 * 
 * 抽屉原理:仔细思考后,我们可以注意到,任何数对1000求模只有1000种可能(0~999),所以我们将K^Power 中的Power从1(为什么不是0?因为K^0=1<1000,而我们不考虑小于1000的情况,题解第3点)到1001逐个求值,总有相等的两个数字。
 *
 */
public class KTail
{
	public static void main(String[] args) throws Exception
	{
		//由末尾三位数相等可知,余数会出现1000种情况
		//因此,设置一个余数数组,用来保存出现的各种余数
		//另外,最多1001次循环,必定能找到余数相同的值
		final int thresholdValue = 1000;			//临界值1000
		int[] remainder = new int[thresholdValue];

		//初始所有余数值为-1
		//将第一些得到对应余数值的幂值设为其余数数组对应值;下次取余数,获得对应的数组不为-1的话(出现余数重复的二个数),则表明找到另一个K尾相等数
		initRemainderArray(remainder);



		System.out.println("输入一个自然数K(K>1):");
		Scanner s = new Scanner(System.in);
		long k = s.nextLong();			//要求输入大于或等于2的整数


		int m=0, n=0;		//保存一对K尾相等数,其中m>n
		int value = 1;

		boolean flag = false;	//是否找到满足大于或等于1000的最小幂
		if(k >= thresholdValue)
		{
			flag = true;
			k = (int)k%thresholdValue;		//若k是很大的整数,则会出现乘积会出现上溢的情况
											// 在数论基础知识里曾证明过(M*N)%R = (M%R *N%R)%R
											// 这样做的原因是避免后面进行乘运算时数据溢出
		}

		for(int i=1; i<=thresholdValue; i++)	//迭代thresholdValue+1必定能找到K尾相等数
		{
			value = (int)(value * k);
			/*
				@TODO 从满足大于或等于1000的最小幂开始
			*/
			if(flag == false)
			{
				if(value >= 1000)
				{
					flag = true;
				}
				else
					continue;
			}

			value = value%thresholdValue;	//每次求余数,防止乘积越界的情况
			
			if(remainder[value] == -1)	//表示之前未设置过
			{
				remainder[value] = i;	//保存第一次得到此余数的幂值
			}
			else
			{
				m = i;
				n = remainder[value];
				break;
			}
		}
		System.out.println("m:\t" + m + "\tn:\t" + n);
		System.out.println(k + "尾相等数:\t" + (m + n));
	}

	/*
		@TODO 初始化余数数组
	*/
	public static void initRemainderArray(int[] remainder)
	{
		for(int i=0; i<remainder.length; i++)
		{
			remainder[i] = -1;
		}
	}
}
 

 

 

 

---------- 运行Java ----------

输入一个自然数K(K>1):

123454321

m: 26 n: 1

321尾相等数: 27

 

输出完成 (耗时 0 秒) - 正常终止

 

 

分享到:
评论

相关推荐

    WOJ1313-K尾数相等

    从键盘输入一个自然数K(K&gt;1),若存在自然数M和N(M&gt;N),使得K^M和K^N均大于或等于1000、且它们的末尾三位数相等,则称M和N是一对?K尾相等数?。请编写程序,输出M+N值最小的K尾相等数。

    作业答案1

    当x接近kπ(k为非零整数)时,条件数趋向无穷大,表明函数在此处对输入变化高度敏感。 3. 递推序列误差分析: - 递推公式 Yun = Yun-1 - 1100√783(n=1,2,...)用于计算Y100。使用近似值√783 ≈ 27.982,通过...

    前端大厂最新面试题-recursion.docx

    3. **划分为k个相等的子集**:这可能涉及到背包问题或组合优化。递归可以尝试将元素分配到不同的子集中,确保每个子集的和相等,同时满足k的限制。 4. **最小因式分解**:这个问题要求找到一个数的最小因子分解。...

    线性时间选择算法实现

    它首先将数组分为两个大致相等的部分,然后根据分割点的位置判断第k小元素应该在哪一部分。通过不断地将数组划分为更小的部分,算法逐渐缩小搜索范围,直到找到第k小元素。 具体实现时,不生成随机数的策略通常是指...

    遞迴(Recusion)

    - **二项式系数**:递归地计算组合数C(n, k)时,利用C(n, k) = C(n-1, k-1) + C(n-1, k),基础情况是当k等于0或n时,返回1。 递归虽然在理解上直观,但在实际应用中需要注意其效率问题,尤其是在数据规模较大时。...

    数据结构数煤二班21-30号试卷.pdf

    4. **循环队列的管理**:队列为空的条件是尾指针与头指针相等,队列满的条件是(尾指针+1)模队列最大长度等于头指针。 5. **二叉树的性质**:高度为h的二叉树至少有h个结点,最多有2^h-1个结点。这是关于二叉树...

    新版苏教版六年级数学上册期中考试题及答案(1).pdf

    ), 8名同学中每两个人比赛一场,即k=2,n=8,所以比赛场数为C(8, 2) = 8! / (2! * 6!) = 28场。 2. **比例问题**:第二题中,甲数与乙数的比例为5:3,已知甲数为60,可以设乙数为x,根据比例关系得出5/3 = 60/x,解...

    数据结构题

    解析:**假溢出**指的是在顺序循环队列中,即使队列并没有真正满,但由于头指针front和尾指针rear相等,系统误以为队列已经满了的情况。 **解决假溢出的常见方法**: - 使用**哨兵元素**:在队列的末尾预留一个额外...

    初二数学暑假作业及答案13套11.doc

    这涉及到概率的基本计算,即符合条件的k值除以总的可能取值数。 3. **命题逻辑**:第13题询问一个原命题为真,逆命题为假的例子。在逻辑中,原命题与逆命题的关系是,原命题真并不意味着其逆命题也真,例如:“所有...

    六年级数学填空、判断、选择基础题.doc

    【填空题8】在0.6,0.666,0.6,67%,这五个数中,最大的数是(67%),最小的数是(0.6),相等的数是(0.6)和(0.6)。 【填空题9】一个圆柱体和一个圆锥体等底等高。已知圆锥体体积比圆柱体少14立方厘米,圆柱体体积...

    五年级数学下册第一次月考试卷精选.doc

    5. 错误,一个数的因数可以与它的倍数相等,例如1的因数和倍数都是1。 6. 正确,3、4、5的任意排列(例如345、354、435、453、534、543)的数字和都是3的倍数,所以它们都是3的倍数。 7. 错误,甲数除以乙数等于15,...

    判断链表是否为回文链表leetcode-Algorithms:Coding_Interviews和Leetcode

    判断二叉树是否相等 反转单链表 单身数字 判断单链表是否为回文链表 从尾到头打印链表 求数组中个数最多的数字 判断单链表是否有环 二分搜索 缺失的数字 包含min函数的栈 合并两个递增排序的链表 连续子序列的最大和...

    2018-2019-1-A答案1

    2. **浮点数运算**:浮点数运算涉及对阶操作,即调整两个数的指数使其相等,以便进行尾数的加减运算。 3. **存储层次结构**:计算机存储系统通常由高速缓存(CACHE)、主存(内存)和辅助存储(外存)组成,形成层次结构...

    小学六年级数学毕业试题有答案【人教版】精选.doc

    成反比例关系意味着XY=k(k为常数),X和Y的变化趋势相反,这里选X=4时,Y=1.6,满足反比例关系。 这些知识点涵盖了小学六年级的数学核心概念,包括大数读写、时间计算、比例与比值、分数与百分比的转换、几何图形...

    人教版初一数学上册方程的意义(提高)巩固练习.doc

    3. **方程的解**:使方程左右两边相等的未知数的值。例如,若x=1是方程2x-a=0的解,意味着当x取1时,方程成立,可以求得a的值。 4. **等式的性质**:等式的性质包括加减同数性质和乘除同数性质。例如,等式的第二...

    大学生数据结构复习题十套卷(含答案).pdf

    - **第k层的最大结点数**:第k层的结点数最多为\(2^{k-1}\)个。 - 其中,\(k\)是从1开始计数的。 #### 二分查找 - **查找过程**:通过比较中间元素,将查找区间不断缩小,直至找到目标元素或区间为空。 - **查找A...

    山东省武城县四女寺镇中考数学复习第13课时一次函数无答案

    - 在生物学示例中,通过两个已知点(尾长与全长的关系)可以建立一次函数关系,从而求出任意尾长对应的全长。 6. **直线的平行与垂直** - 如果两条直线平行,它们的斜率相等,即 k1 = k2。 - 如果两条直线垂直,...

    839不完全回忆版(2017)1

    此资源涵盖了操作系统、...判断无序图P中任意两个顶点是否存在距离为K且不含回路的路径的函数可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来实现。该函数需要维护一个访问数组,以便记录已经访问过的节点。

    平面向量的基本概念及线性运算.pdf

    数乘向量a的k倍可以表示为ka,其中k是标量。数乘的性质包括:(1)(ka)b=k(ab),(2)a(ba)=a(-b)=-a(ba),(3)1a=a。 在几何问题中,向量的运算是解决位置关系和长度计算的关键工具。例如,例1展示了向量的加法在图形中...

Global site tag (gtag.js) - Google Analytics