HDU-6033 Add More Zero - 2017 Multi-University Training Contest - Team 1(水之崩心态题)

本文介绍了一个简单的算法实现,用于解决一个特定的数学问题:给定一个数m,找到满足10^k≤2^m-1的最大整数k。文章通过运用对数函数的性质简化了原始问题,并提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给一个数m,求一个数k满足10^k小于等于2^m-1。

思路:

先了解几个数学知识:

(logn m) = (logx m)/(logx n)

(logn m) = 1/(logm n)

log(N*M) = logN + logM

cmath头文件中的log(x)是以e为底x为真数的对数函数(也有log2(x), log10(x)),即数学中的ln(x),e = 2.718281828459。求任意数A的开N次方:pow(A, 1/N)。

对数函数的单调性

当a>1时,y = (loga x)在(0,+∞)上为增函数

当0<a<1时,y = (loga x)在(0,+∞)上为减函数


这题其实是简单的公式化简:

= 10^k <= 2^m-1

= 10^k < 2^m

= ln10^k < ln 2^m

= k*ln10 < m*ln2

= k < m*1n2/1n10


代码:

#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
	int m, ans1, count = 0;
	while(~scanf("%d", &m))
	{
		double ans2 = (double)m*log(2)/log(10);
		ans1 = ans2;
		//判断相等与否,本题不判断也能过 
		if(ans2 > ans1) printf("Case #%d: %d\n", ++count, ans1);
		else printf("Case #%d: %d\n", ++count, ans1-1);
	}
	return 0;
}


继续加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值