• 关于数的位数


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

  • 相关阅读:
    Codefoces Gym 101652 【最大连续和】
    HYSBZ 4034 【树链剖分】+【线段树 】
    Codeforces Gym 101291C【优先队列】
    Codeforces gym 101291 M (最长交替子序列)【DP】
    HDU 3308 LCIS (经典区间合并)【线段树】
    POJ 3237 Tree (树链剖分+边权转点权)
    POJ 2763 Housewife Wind (树链剖分+边权转点权)
    P1054 等价表达式
    P1107 [BJWC2008]雷涛的小猫
    P1552 [APIO2012]派遣
  • 原文地址:https://www.cnblogs.com/syhien/p/7623456.html
Copyright © 2020-2023  润新知