码迷,mamicode.com
首页 > 其他好文 > 详细

关于数的位数

时间:2017-10-02 23:47:47      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:noip   数学   

关于数的位数

这是我的第一篇产出! 
求一个数字的位数,可以不断地%10并计数。 
但是对于一个极大的数,高精度又受限制(我觉得不会有人喜欢写高精度的),怎么求位数呢?

3939这是一个四位数,我们换一个方法看这个数。 
1.3939>10^0,即3939>1,3939至少有 (0+1) 位数 
2.3939>10^1,即3939>10,3939至少有 (1+1) 位数 
3.3939>10^2,即3939>100,3939至少有 (2+1) 位数 
4.3939>10^3,即3939>1000,3939至少有 (3+1) 位数 
5.3939<10^4,即3939<10000,3939有 (3+1) 位数

从上面的过程易得

对一个数x,它的位数为lg(x)+1

emmm是一个非常显而易见的结论呢..实战演练怎么样呢? 
洛谷https://www.luogu.org/problem/show?pid=2759

题目描述

使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少?

输入格式

一个正整数 n

输出格式:

使得 x^x 达到 n 位数字的最小正整数 x

输入样例#1:

11

输出样例#1:

10

说明

n<=2000000000

2后面是9个0,这个数多大炸不炸希望大家心里有数。

从0枚举x,希望不大,20分都是奇迹 
蛮明显的是二分,但是怎么分呢这是个问题。 
这个时候,我们刚刚得到的式子就显得尤为重要

对一个数x,它的位数为lg(x)+1

本题是x^x,那么位数就是

x*lg(x)+1

而且c的math已经有现成的log,log10了,我们可以直接拿来白嫖。 
log10(double x)返回一个浮点数,后面的位数不需要,转成整形时会消掉。

#include<iostream>
#include<cmath>
using namespace std;
long long int n,l=1,mid,r=(long long)3e9;
int main()//x^x>=10(n-1)
{
	ios::sync_with_stdio(false);
	cin>>n;
	while(l<r)
	{
		mid=(l+r)/2;
		if(mid*log10(mid)+1>=n)
			r=mid;
		else
			l=mid+1;
	}
	cout<<l;
	return 0;
}

3e9那里的(long long)让编译器闭嘴 
非常朴素的二分...

就这样了!大家快去把它A了吧,提高+/省选-哦!


本文出自 “13355936” 博客,转载请与作者联系!

关于数的位数

标签:noip   数学   

原文地址:http://13365936.blog.51cto.com/13355936/1970250

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!