zoukankan      html  css  js  c++  java
  • 关于数的位数

    这是我的第一篇产出!
    求一个数字的位数,可以不断地%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()
    {
    	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了吧,提高+/省选-哦!

  • 相关阅读:
    设计模式之工厂模式
    Java内存区域与内存溢出异常
    Spark环境搭建
    Android获取蓝牙地址
    Intent和BroadcastReceiver
    Fragment初探
    Acticity的生命周期和启动模式
    Maven依赖,去哪儿找
    Spring-BeanDefinition
    Spring-BeanFactory体系介绍
  • 原文地址:https://www.cnblogs.com/syhien/p/7623456.html
Copyright © 2011-2022 走看看