标签:
数的长度:
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