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

基本数学问题

时间:2016-05-12 22:34:24      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

数的长度:
N!是非常大的数,计算公式为:N!=N*(N-1)*(N-2)……2*1.现在需要知道N!有多少(十进制)位。每行输入1个正整数N。对于每个N,输出N!的(十进制)位数
分析:
所谓N!的(十进制)位数,就是(lgN!)+1,根据数学公式,有N!=1*2*3……(N-1)*N,所以lgN!=lg2+lg3……lgN。

#include<stdio.h>
#include<math.h>
int main(void)
{
    int N,i;//定义正整数N 
    double sum;//定义N!(十进制)位数
    while(scanf("%d",&N)!=EOF)
    {
        sum=0.0;
        for(i=2;i<=N;++i)
        {
            sum=sum+log10(i);   
        }   
        printf("%d\n",(int)sum+1);
    } 
    return 0;

}

最左边的数
/*给一个正整数N,请输入N^N最左边的数。
输入包含一系列测数组,输入组的第一行为整数T,表示共有T组,每组测试组包含一个正整数N,1<=N<=1000000000.
输出N^N最左边的书。
分析:
本题目主要是给定一个正整数N,计算N^N的结果的最高位上的数字的值。
如果通过求N^N的最后结果然后再求最高位数字,方法简单,但是存在问题,就是N比较大的时候,N^N太大而无法用程序存储,需要设计大数的存储方案,且带来了计算过程中的难度
而且消耗大量内存空间和时间,不可取。
另一种方法,设N^N=d..10^(k-1),其中k表示N^N的位数,那么d.=10^((lgN^N)-(k-1)),再对d.*取整即可获得最终结果。因为k等于lgN^N的整数部分加1,即k=lgN^N+1(取整)
,所以可获得d的计算公式d=10^(lgN^N-lg10N^N)(取整)*/

#include<stdio.h> 
#include<math.h>
int main(void)
{
    int N,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        printf("%d\n",(int)pow(10,N*log10(N)-(int)(N*log10(N))));       
    }
    return 0;

}

基本数学问题

标签:

原文地址:http://blog.csdn.net/ltoddy/article/details/51352125

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