[xdoj1029]求解某个数的最高位和最低位

解题关键:

1、最高位求法

long long int x=n^m; 
式子两边同时取lg lg(x)=m*lg(n); 
x=10^(m*lg(n)); 
10的整数次方的最高位一定是1,所以x的最高位取决于m*lg(n)的小数部分 
k=m*lg(n)的小数部分=m*lg(n)-floor(m*lg(n)); 
x的最高位=floor(10^k);

注意浮点数会有误差,所以,通不过时要加点小数

2、最低位求法

普遍情况下可以运用快速幂求解,而本题由于是2的n次幂,所以可以直接用打表求解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int b[100]={2,4,8,6};
int main(){
    int t,n,t2;
    double m,x;
    cin>>t;
    while(t--){
        cin>>n;
        t2=(n-1)%4;
        x=n*log10(2.0);
        x-=(int)x;
        m=(int)(pow(10.0,x)+0.000001);
        cout<<m<<" "<<b[t2]<<endl;
    }
}
时间: 2024-08-26 07:48:18

[xdoj1029]求解某个数的最高位和最低位的相关文章

exgcd扩展欧几里得求解的个数

知识储备 扩展欧几里得定理 欧几里得定理 (未掌握的话请移步[扩展欧几里得]) 正题 设存在ax+by=gcd(a,b),求x,y.我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0: int exgcd( int a, int b, int &x, int &y ) { if( b == 0 ) { x = 1; y = 0; return a; } int tmp = a % b; if( tmp > b ) swap( tmp, b ); int ans=exg

Spoj-DISUBSTR - Distinct Substrings~New Distinct Substrings SPOJ - SUBST1~(后缀数组求解子串个数)

Spoj-DISUBSTR - Distinct Substrings New Distinct Substrings SPOJ - SUBST1 我是根据kuangbin的后缀数组专题来的 这两题题意一样求解字符串中不同字串的个数: 这个属于后缀数组最基本的应用 给定一个字符串,求不相同的子串的个数. 算法分析: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数. 如果所有的后缀按照 suffix(sa[1]), suffix(sa[2]), suffix(sa

判断一个数是否是2的幂次方以及保留一个数的最高位的方法

#include <stdio.h> int check_power(unsigned int n){ /**************************************** * 如果n是2的幂,那么 (n-1)也就是其二进制全为1的数 *****************************************/ if (n & (n-1)) { return 1; } return 0;}unsigned int get_next_power(unsigned i

C求解一个数二进制1的个数

#include <iostream> using namespace std; int Grail(int x) { int N=0; while(x) { x=x&(x-1); N++; } return N; } int main() { cout<<Grail(7)<<endl; //0111 //0110 //0101 //0100 //0100 //0011 return 0; }

(C语言)回文数的判断

问题描述: 判断一个数是否为回文数: 121: 12321: 1234321: 程序分析: 1. 回文数(palindromic number):是指一个数的最高位和最低位上的数相等,第二高位与次低位上的数相等,也就是关于中间"对称".如上面的三个数情况是一个回文数. 2.将这个数扩展成一个数组,将这个数的各个位上的数取出来并且一一赋给这个数组. 3.判断这个数组中的元素之间的关系是否符合回文数的特征.并且将结果输出.这个程序写了一个函数来实现这一功能. 代码如下: #include&

c语言中求解1的个数

在c语言中有三种求解一个数1的个数的方法 将整数每次右移一位的方式 int Numble(int n) { int count = 0; while (n) { if (n & 1 == 1) count++; n = n >> 1; } return count; } 但这种方法存在的不足是,当这个整数是负数的时候,将无限循环 使整数与1进行与运算,1每次左移一位 int Numble(int n) { int count = 0; int flag = 1; while (flag

求解PDE的多重网格法(MG)

多重网格法相对于普通的Jacobi迭代或者G-S迭代等能够得到和未知数的个数成线性的高效运行时间的主要原因在于:迭代初值的一步步接近真值和G_S方法的前面几步的快速收敛性. 先看一张图[1]: 这张图说明了以下几点:一.G-S迭代法在开始几步迭代时收敛速度很快,但是随着步数的增加收敛速度逐渐减慢:二.第一条性质和求解的方程未知数的个数无关,尤其是在最开始的收敛速度很快的几步:三.未知数个数越少,最终收敛速度越快,如图中的绿线(这个可以从另一个角度来理解,一般情况下,求解未知数个数少的方程显然比求

poj3252--Round Numbers(组合篇1--求1到n内的二进制数中0的个数大于1的个数)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9525   Accepted: 3420 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',

一个求解平方根的算法题

1. 问题描述 问题是这样子的,给定一个数a,求解这个数的平方根,要求精度f<0.0001. 好久没有操刀实现算法代码了,今天就来写一个小的,后续算法依旧是研究的重点.比较软件中,算法是核心是灵魂啊! 2. 算法分析 说起来,这个算法题其实不是太麻烦,主要采取的就是不断试探,逼近真是目标值的思路,最容易想到的就是,不断的折半逼近,有点类似二分的思想.同时,一个重要的思想: 1. 设目标值平方根为Se 2. 待求解的输入数据为St 3. |Se*Se - St| < f*f 4. 求出一个Se*