找出N^N的最左边的一位数和最后边的一位数

问题:找出N^N的最左边的一位数和最右边的一个数,N(1<=N<=1,000,000,000).

找最右边一位:

    分析:其实找左右边的一位数还挺简单的,快速幂每次都只取结果的最后一位参加下一次运算,取最终结果的最后一位

找最左边一位:

    可以用科学记数法表示N^N的计算结果,科学计数法表示的有效数的整数部分就是答案

    输入一个N,

    用科学计数法表示N^N = a * 10^n,其中a的整数部分只有一位

    两边同时取对数,得到N*lg(N) = lg(a) + n

    因为 1 < a < 10,所以0 < lg(a) < 1, 且n是整数,也就是说lg(a)是N*lg(N)的小数部分,n是N*lg(N)的整数部分,

    那么10^(N*lg(N) - (int)N*lg(N))就是结果了

注意:结果比较大的时候可以用__int64或者long long(一样)

找最右边数题目:http://acm.hdu.edu.cn/showproblem.php?pid=1061

找最左边数题目:http://acm.hdu.edu.cn/showproblem.php?pid=1060

我的代码:

最右:

#include <stdio.h>
#include <math.h>
#define LL __int64
LL Qfact(LL n)
{
    LL res = 1, pow = n;
    while(n)
    {
        if(n & 1)
        {
            res *= pow;
            res %= 10;
        }
        pow *= pow;
        pow %= 10;
        n /= 2;
    }
    return res;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        LL n, ans;
        scanf("%I64d", &n);
        ans = Qfact(n);
        printf("%I64d\n", ans%10);
    }
    return 0;
}

最左:(科学计数法)

#include <stdio.h>
#include <math.h>
#define LL __int64
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        LL n;
        scanf("%I64d", &n);
        double ans = n*log10(n*1.0);
        ans = ans-(LL)ans;
        ans = pow(10.0, ans);
        printf("%I64d\n", (LL )ans);
    }
    return 0;
}

    

时间: 2024-10-12 22:23:18

找出N^N的最左边的一位数和最后边的一位数的相关文章

找出整数中第k大的数

一  问题描述: 找出m个整数中第k(0<k<m+1)大的整数. 二  举例: 假设有12个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2, -9],请找出第5大的数(容易知道是0). 三   算法思路:        一种基于快排思想的算法可以在O(n)复杂度内找到第k大的数,首先要知道partition这个函数,它可以调整一个序列 使小于key的元素都排在key左边,大于key的元素都排在key右边,key可以在这个序列中任意选择,一般选择给定序 列

《找出1到正整数N中出现1的次数》

编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果:而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位:当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准:若为1,则等于

找出范围内丢失的数据

数据库环境 SQL SERVER2008R2 需求:有一个表的日期字段,存的是每天的日期,且该字段存在唯一性约束.由于管理员误操作,把当前月的一些日期给删了, 现在要把被删除的日期给找出来. 实现思路:创建一个日期辅助表,辅助表存的是当前月的所有日期,再和目标表左关联,日期对应不上的则是丢失的日期. 数据准备: 1.创建一个1-100的自然数列表 SELECT TOP 100 id = IDENTITY( INT,1,1 ) INTO dbo.t100 FROM sysobjects 2.模拟生

找出数字在已排序数组中出现的次数

一,问题描述 假设给定一个有序的整型数组arr,以及一个整数 k,问 k在数组中出现了几次? 二,求解思路 ①数组是有序的,故可考虑用二分查找 ②如果能找到 k 在数组中第一次出现时的索引位置first_index 和 最后一次出现时的索引位置last_index 就可以知道 k 出现的次数了: (last_index - first_index) + 1 而对于有序数组而言,可以通过二分查找求出某个数第一次出现的索引位置 和 最后一次出现的索引位置.故总的时间复杂度为O(logN) ③特殊情况

找出有序数组中绝对值最小的数

问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值. 方法1: 遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数. 方法2: 二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn). 分析步骤: 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场: 如果a[mid]<0,因为数组是升序,说明绝对值

找出链表的第一个公共节点

62.找出链表的第一个公共结点.题目:两个单向链表,找出它们的第一个公共结点 思路: 1.暴力法 但时间复杂度太高 o(n*m) 2.如果两个链表有公共节点,则从该公共节点起,后面的节点均为公共的,即这两个链表在第一个公共节点交叉,然后形成一个Y字型,因为两个链表长度不一定一样,所以可以先求得他们的长度n与m,然后得到长度差:Math.abs(n-m),然后先对较长链表先行遍历n-m个节点,从第n-m+1个节点开始对这两个链表遍历,然后找出第一个相同的即可  (网上抄别人的) 3. 位图法 对两

高效的算法找出中间所有A[i] = i的下标

给定一个排好升序的数组A[1].A[2].--.A[n],其元素的值都两两不相等.请设计一高效的算法找出中间所有A[i] = i的下标.并分析其复杂度. 解析:首先分析一下这个数组,假设其中某个位置的A[i] = i,那么可以肯定的值,之前的A[x] > x,之后的A[x] < x.还有一个显而易见的性质就是中间的A[i]=i一定是连续存在的,不可能跨区域存在,因为这个数组是升序的. 我给出的方法是二分查找,具体的做法是:我们假设一个新数组B,其元素是A[i] - i的值,这样的话,B[i]

10个小球用天平找出重量不同的那个

上周被人出了一道算法题目,题目的内容是:有10个小球,外观一样,其中1个小球和其他9个小球重量不一样,请使用天平以最少的次数找出这个重量不一样的小球. 解题思路:其实这是一个很典型使用分治算法的例子,由于不知道这个特别的小球是比其他球重还是轻,所以我们不能简单的使用二分法去求解,所以我选择3为模. 解题步骤: 1.将10个球分成4个数组,分别是A[a1, a2, a3],B[b1, b2, b3], C[c1, c2, c3], D[d1]:假设这个重量不一样的球为n,其他普通球的任意一个是m:

面试- 阿里-. 大数据题目- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

假如每个url大小为10bytes,那么可以估计每个文件的大小为50G×64=320G,远远大于内存限制的4G,所以不可能将其完全加载到内存中处理,可以采用分治的思想来解决. Step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999,每个小文件约300M); Step2:遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,...,b999); 巧妙之处:这样处理后,所