C - Rightmost Digit

Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 1061

Description

Given a positive integer N, you should output the most right digit of N^N.

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.

Each test case contains a single positive integer N(1<=N<=1,000,000,000).

Output

For each test case, you should output the rightmost digit of N^N.

Sample Input

2

3

4

Sample Output

7

6

Hint

In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.

Difficulty:这题一开始想直接算出那个数,然后再取余数,后来发现这个数太大会超出计算机范围(爆了)。这时就需要用到一定的数学知识:在乘法中最后一位数,只取决于两个数的最后一位数。列如129*19的两个数的最后一位数取决于9*9 =81即129*19最后一位数为1.所以要边计算边取余数。

#include<cstdio>
#include<cstring>
using namespace std;
int t,a,b;
long long n,k,ans;
int main()
{
scanf("%d",&t);
while(t--)
{ a=b=k=0;ans=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
a=n%10;
ans*=a;
ans=ans%10;
}
printf("%d\n",ans);
}
return 0;
}

后来发现N给的10的9次方这么大,如果for循环肯定会TLE。这时又要用快速幂来优化:快速幂:



也就是说:a^8=(a^4)^2,这样算一次a^4就等于算了两次a^4了~所以这里我用到递归,a^4=(a^2)^2,a^2=(a^1)^2;那么知道a即可求出。

#include<cstdio>
#include<cstring>
using namespace std;
int t,a,b;
long long n,k,ans,y;
long long pow(long long k,long long n)
{if(k==1)
return n%10;
if(k%2==1)//快速幂
{k=(k-1)/2;
y=pow(k,n);//递归
ans=y*y*n%10;
ans=ans%10;//边计算边取余数
return ans;}
else
{k=k/2;
y=pow(k,n);
ans=y*y;
ans=ans%10;
return ans;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{ a=b=y=0;ans=1;
scanf("%d",&n);
k=n;
printf("%lld\n",pow(k,n));
}
return 0

Way 2:位运算,将n看作是二进制,例如9=111。即N的9次方等于N的2^2次方乘N的2^1次方乘2^0次方。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int t,k,b;
long long n;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
k=1;
b=n%10;
while(n)
{
if(n%2==1)
{
k*=b;
k=k%10;
}
b*=b;//2进制进位。可以自己手算。
b=b%10;
n=n/2;
//printf("%d\n",k);
}
printf("%d\n",k);
} return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Rightmost Digit(快速幂+数学知识OR位运算) 分类: 数学 2015-07-03 14:56 4人阅读 评论(0) 收藏的更多相关文章

  1. 【solr专题之一】Solr快速入门 分类: H4_SOLR/LUCENCE 2014-07-02 14:59 2403人阅读 评论(0) 收藏

    一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr ...

  2. 快速幂取模 分类: ACM TYPE 2014-08-29 22:01 95人阅读 评论(0) 收藏

    #include<stdio.h> #include<stdlib.h> //快速幂算法,数论二分 long long powermod(int a,int b, int c) ...

  3. magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏

    魔方矩阵 魔方矩阵是有相同的行数和列数,并在每行每列.对角线上的和都相等.你能构造任何大小(除了2x2)的魔方矩阵. 1.历史       魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说 ...

  4. mysql快速入门 分类: B6_MYSQL 2015-04-28 14:31 284人阅读 评论(0) 收藏

      debian方式: apt-get install mysql-server-5.5 mysql -u root -p   redhat安装方式 一.下载并解压 $ wget http://cdn ...

  5. Lucene学习总结之六:Lucene打分公式的数学推导 2014-06-25 14:20 384人阅读 评论(0) 收藏

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

  6. JDBC之一:JDBC快速入门 分类: B1_JAVA 2014-02-19 14:49 745人阅读 评论(0) 收藏

      (1)下载Oracle的JDBC驱动,一般放在$ORACLE_HOME/jdbc/lib目录,关于驱动的版本请见: http://elf8848.iteye.com/blog/811037     ...

  7. hilbert矩阵 分类: 数学 2015-07-31 23:03 2人阅读 评论(0) 收藏

    希尔伯特矩阵 希尔伯特矩阵是一种数学变换矩阵 Hilbert matrix,矩阵的一种,其元素A(i,j)=1/(i+j-1),i,j分别为其行标和列标. 即: [1,1/2,1/3,--,1/n] ...

  8. Ubuntu 字体修改以及字体的相关知识 分类: ubuntu 2014-06-19 21:46 81人阅读 评论(0) 收藏

    Ubuntu chrome 字体修改 打开任意一张含有输入框的网页,比如Google首页,然后右键点击"搜索框"会拉出一个菜单,我们这样选: 拼音检查选项==>语言设置==& ...

  9. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...

随机推荐

  1. 利用智能手机(Android)追踪一块磁铁(一)

    之前看到一个外国人用iPhone做了一个追踪磁铁的Demo感觉不错(参考视频:http://v.youku.com/v_show/id_XODM2MjczNzE2.html),然后我就参考做了一个An ...

  2. 【转】手机web——自适应网页设计(html/css控制)

    手机web——自适应网页设计(html/css控制) 就目前形势来看,Web App 正是眼下的一个趋势和潮流,但是,对于Web App的设计可能大家有的不是很了解,下面就将整理好的网页设计的技巧奉献 ...

  3. DirectX 初始化DirectX(第一方式)

      上一章我们学会了如何C++Win32项目中搭建DirectX开发环境, 那么下面来写代码初始化DirectX吧O(∩_∩)O~. 首先你创建一个Win32程序,点击运行你可以看见一个window窗 ...

  4. qt model/view 架构基础介绍之QListWidget

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from Py ...

  5. 判断包含字符String.contains

    Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 java.lang.String.contains() 方法返回true,当且仅 ...

  6. Git源码管控规范

    Git分支示意圖 Master:主分支.形成稳定的版本时,才将代码合并到Master分支 Relase:网站发布的分支.通过验证的Bug和功能需求,才合并到Release分支,并将稳定的版本进行备份 ...

  7. [Ember] Wraming up

    1.1: <!DOCTYPE html> <html> <head> <base href='http://courseware.codeschool.com ...

  8. (转)浅谈ASP.NET报表控件

    项目中有报表图形化的需求, 于是开始在网上找第三方chart控件.因时间紧迫,大至确定了几个候选:一.Office带的OWC控件:二.ComponentOne:三.Web Chart.本文将讲解ASP ...

  9. C#中的委托和游戏中的运用

    C#中的委托与游戏中的运用 1.什么是委托 在C/C++中,有函数指针的概念,即指向函数的指针.当我们调用该指针时,就相当于调用了该指针所指向的函数,这就是函数指针的一个作用,而他另一个作用就是将自己 ...

  10. [转载]启用 VIM 中的 Python 自动补全及提示功能

    转载: http://zhongwei-leg.iteye.com/blog/941474 周围的同事不喜欢使用 VIM 写 Python 代码的原因之一就是,VIM 不能像 Visual Studi ...