}
if(n>1)
ret*=n-1;
returnret;
}
语法:result=BitAt(int x, int i);
参数:
x:十进制 x
i:要求二进制的第i位
返回:返回x的二进制表示中从低到高的第i位
注意:
最低位为第一位
源程序:
int BitAt(int x, int i)
{
return ( x & (1 << (i-1)));
}
语法:result=int reduce(int prime[],int pn,int n,intrest[])
参数:
Prime[]:素数表,至少需要达到sqrt(n)
pn:素数表的元素个数
N:待分解的数
Rest:分解结果,按照升序排列
返回:分解因子个数
源程序:
int reduce(int prime[],int pn,int n,intrest[])
{
int i,k=0;
for(i=0;i<pn;i)
{
if (n==1) break;
if (prime[i]*prime[i]>n){rest[k]=n;break;}
while(n%prime[i]==0)
{
n/=prime[i];
rest[k]=prime[i];
}
}
return k;
}
举例:输出a^n mod m的
int pow_mod(int a,int n,int m)
{
if(n==0)
return 1;
int x=pow_mod(a,n/2,m);
long long ans=(long long)x*x%m;
if(n%2==1)
ans=ans*a%m;
return (int)ans;
}
举例:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
__int64 cas,b,i,d;
double a,m,n,c;
cin>>cas;
for(i=0;i<cas;i)
{
cin>>n;
a=n*log10(n);
b=(__int64)(a);
c=a-b;
d=(__int64)(pow(10,c));
cout<<d<<endl;
}
return 0;
}
以下是大牛的解释:
先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)loga(c);
假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)7;
log10(1.0234432)就是log10(10234432)的小数部分.
log10(1.0234432)=0.010063744
10^0.010063744=1.023443198
那么要取几位就很明显了吧~
先取对数(对10取),然后得到结果的小数部分bit,pow(10.0,bit)以后如果答案还是<1000那么就一直乘10。
注意偶先处理了0~20项是为了方便处理~
这题要利用到数列的公式:an=(1/√5) *[((1√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
取完对数
log10(an)=-0.5*log10(5.0)((double)n)*log(f)/log(10.0)log10(1-((1-√5)/(1√5))^n)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-34960-42.html
超级期待啊