数位操作
【数位长度】
给定一个数 n,求其位数。
将其写成科学计数法 n = x.abcd * 10y (|x| < 10), 其中的y其实就是除最高位以外的位数
f(n) = y + 1 = log10(n) + 1;
【求一个数的高3位和低3位】
给定一个数n,不知其位数,低三位就是 n mod 1000,另外,低三位对于乘方具有可迭代性因为不涉及进位。
求高三位,关键是要求出x.abcd, lg(n) = lg(x.abcd) + lg(10y) =lg(x.abcd) + (int)lg(10y)
求出x.abcd再将其乘1000取整。
【例题】LightOJ - 1282
#include<iostream> #include<cmath> #include<cstdio> using namespace std; typedef long long ll; const int mod = 1000; long long qPow(long long a ,long long n){ long long ans = 1; //如果n的二进制最后一位是1 结果参与运算 //因为如果是0,那么幂运算之后该项是1,1乘任何数还是那个数,对结果不影响 while(n > 0){ if(n & 1) ans = (ans* a) % mod; a = (a*a) % mod;//底数加倍 n >>= 1;//移位 } return ans; } int main(){ int t; cin>>t; ll n,k; int cas = 1; while(t--){ cin>>n>>k; ll low = n % mod; low = qPow(low , k); //求高三位 int len = 1.0*k*log10(n);//科学计数法10的指数 double high = pow(10.0, 1.0*k*log10(n) - len) ; while(high < 100){ high = high*10; } int high1 = (int)high; printf("Case %d: %03d %03d\n",cas++, high1, low); } return 0; }