Oj之路(第二天)

今天第二天,觉得自己从题目中获取的东西不少,所以对编程题目也比较越来越有兴趣--这是个不错的开端,所以希望自己能继续玩下去。得意

接下来看一道又是用到“记忆搜索”思想的题目吧----继续吐槽一遍,这”记忆搜索“真是高大上~希望能加深领悟这种思想。

=======================================================================================================

题目描述:
从键盘输入一个自然数K(99999999>K>1),若存在自然数M和N(M>N),使得K的M次方和K的N次方均大于或等于1000,
且它们的未尾三位数相等,则称M和N是一对“K尾相等数”。请编程序,输出K尾相等数中M+N最小值。
输入样例
2
输出样例
120

=======================================================================================================

思考过程:

首先,观察易知用直接k的m次方和k的n次方进行判断是不科学的,题目要求判断的只是”末尾三位数“,所以我们只要取k的m次方和k的n次方

的末尾三位数即可--取余1000即可。

”记忆搜索“思想的体现:

每次我们判断的时候都会用到之前用过的末尾三位数--重复使用之前的结果。

所以这里我们用一个数组来保存”x次幂的值“的末尾三位数,之后判断的时候直接拿来用就好了

=========================================================================================================
源代码:

#include <stdio.h>
#include <math.h>

int tail[1000];//用来记录k的x次幂的末尾三位数
int findMin(int k) 
{
	for (int i = 1;; ++i)
		if (pow((double)k, i) > 1000)
			return i;
}
int main()
{
	int k;
	scanf("%d", &k);
	int min = findMin(k);//findMin函数用来找出最小的i幂,使得k的i次幂大于等于1000,因为再小的幂我们用不到  
	tail[min] = (int)pow((double)k, min) % 1000;
	for (int i = 2 * min + 1;; ++i) {

		int m = i - min, n = min;
		tail[i - min] = tail[i - min - 1] * k % 1000;//记忆搜索的体现
		for (; m > n; m--, n++) {
			if (tail[m] == tail[n]) {//记忆搜索的体现
				printf("%d\n", m + n);
				return 0;
			}
		}
	}
}

=========================================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? (3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼? (4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值