poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法

法一:对一个数求它的对数,+1取整为其位数

问题转化为int (log10(N!)+1),对数性质log10(N!)=log10(N)+log10(N-1)+...+log10(1)

/*用log10求位数*/

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

int main()
{
    int tim,N;
    scanf("%d",&tim);
    while(tim--)
    {
        int i;
        double NumOfDigit=1;
        scanf("%d",&N);
        for(i=N;i>=1;i--)
        {
            NumOfDigit+=log10(i);
        }
        printf("%d\n",(int)NumOfDigit);
    }
}

  当n偏大的时候,时间长,TLE

法二:Stirling公式

log(n!) = log10(sqrt(2*pi*n)) + n*log10(n/e);

/*用斯特灵求位数*/

#include<stdio.h>
#include<math.h>
#define e 2.718281828459045
#define pi 3.141592653589793239
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&N);
        double num_digit;
        num_digit=log10(sqrt(2*pi*N)) + N*log10(N/e);
        printf("%d\n",(int)num_digit+1);
    }
    return 0;
}

  WA两次原因:

 num_digit=log10(sqrt(2*pi*N)) + N*log10(N/e)+1;
        printf("%d\n",(int)num_digit);

  当N=1,num_digit=0.几,因为当n=1时,

log10(sqrt(2*pi*N)) + N*log10(N/e)=-0.03

  最后值就为0

总结:用斯特林公式求位数时,考虑到N=1,加1放在取了整之后

(int)(log10(sqrt(2*pi*N)) + N*log10(N/e))=0加1放在取了整之后

int(3.1+1)=4int(3.1)+1=4int(3)+1=4int(3+1)=4int(-0.03)+1=1int(-0.03+1)=0 
				
时间: 2024-12-11 17:19:17

poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法的相关文章

求一个整数的位数

C++ 吧里看到有人求助, 说是想写点代码求一个整数的位数, 以下是我的解决方法: int32_t RecursionIter (const int64_t& num, const int32_t& result) { if (num < 0) { return RecursionIter (-num, result); } else if (num / 10 == 0) { return result; } else { return RecursionIter (num / 10

利用TextFieldDelegate代理方法 – textField:shouldChangeCharactersInRange:replacementString: 限制输入字符

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == _workIdTxt) { NSUInteger lengthOfString = string.length; for (NSInteger loopIndex = 0; loopIndex < lengthO

网站资源被盗链的:预防方法 VS 网站资源防盗链的:破解技巧

资源被盗链:(简明定义) 下载者不是从你的网站直接下载资源,而是通过其他盗链网站提供的你的下载资源链接进行下载你的服务器资源! http://baike.baidu.com/view/272422.htm 一>预防方法: 方法1:判断引用地址这个方法是最早及最常见的方法.所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的 值,这个值在asp.net里面可以用 Request.UrlReferrer属性取得.几个例子来说,在正常情况下当用户在浏览 http://uushare.

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { public static void main(String[] args) { /** * 2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123, * 相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0. * 方法是先将整型数字转换到数组中,再判断.

高效求一个整数中1的位数

求一个整数中0或1的位数,有很多方法可以使用除法,求余等方法,也可以使用位运算,相比前者效率更高. #include <stdio.h> #include <stdlib.h> //求一个整数 1的位数 int count0(int x) { int num=0; while(x) { num+=x%2; x/=2; } return num; } int count1(int x) { int num=0; while(x) { num+=(x&0x01); x>&

HDU 1018 大数(求N!的位数/相加)

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35382    Accepted Submission(s): 16888 Problem Description In many applications very large integers numbers are required. Some of these

输入一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

package com.hanqi; import java.util.*; public class Nixudayin { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.println("输入一个不多于5位的正整数"); Scanner shu=new Scanner(System.in); String a=shu.next(); System.out.println("输入的

c#编程:给定一个正整数求出是几位数并逆序输出

<span style="color:#FF0000;">第一步:把输入的数字转为字符串n.ToString() 第二步:求出字符串的长度即为正整数的位数 第三步:从后向前逆序输出</span> 附代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; //给一个正整数, //要求:一.求它是几位数,二.逆序打印出各位数字. namespa

定义一个长方形类,定义 求周长和面积的方法实例

/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: import必须出现在所有的class前面.*/ import java.util.Scanner; class ChangFangXing { //长方形的长 private int length; //长方形的宽 private int width; public ChangFangXing(){} //