HDOJ -- 1061 Rightmost Digi
2016-07-23 14:45
363 查看
<span style="font-size:24px;">Description</span>
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.
解题思路:快速幂运算问题,即把指数都拆成平方的形式,减少运算量。即3^3=3*3^2,4^4=(4^2)^2,5^5=5*(5^2)^2...
题目要求的是最右的一位数(即个位),所以只需将结果对十取余即可。(方法一)
当然,这道题有特殊规律:
当n =1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 ...
a = 1 4 7 6 5 6 3 6 9 0 1 6 3 6 5 6 7 4 9 0 1 4 7 6 5 6 3 6 9 0 ...
所以是以20为一个周期,直接定义一个数组,把所有情况列出即可!(方法二)
方法一:
#include<stdio.h> __int64 quickpow(__int64 n){ __int64 ans=1,base=n; while(n){ if(n&1){//如果n是奇数 ans=(base*ans)%10;//分离出一个底数 } base=(base*base)%10;//逐步求base的平方 n>>=1; } return ans; } int main(){ __int64 t,n;//用int型精度不准,提交时WA scanf("%I64d",&t); while(t--){ scanf("%I64d",&n); printf("%I64d\n",quickpow(n)); } return 0; }
方法二:
#include<stdio.h> int a[21] = {0,1,4,7,6,5,6,3,6,9,0,1,6,3,6,5,6,7,4,9,0}; int main (){ int t,n; scanf ("%d",&t) ; while (t--){ scanf ("%d",&n); printf("%d\n",a[n%20]);//以二十为一个周期 } return 0 ; }
相关文章推荐
- Mybatis常用的jdbcType数据类型
- UITabBarController 和 UINavigationController 的详解
- 二叉搜索树的插入和删除结点操作以及iterator的构造
- MyBatis分页的简单实现
- 优化加载和执行提高javascript性能
- 百练 4130 Saving Tang Monk [BFS+优先队列+状态压缩]
- Javascript错误提示--SyntaxError: Illegal return statement
- SQLServer中服务器角色和数据库角色权限详解
- 基于win32的windows画板程序
- 多媒体文件格式之AVI
- C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.
- Python函数第三节
- Java语言中switch语句、用switch编写简单的计算器
- html5 draggable
- 使用WinDbg —— .NET篇 (十)
- 信息安全管理(3):网络安全
- 策略模式
- SDL编程初步
- simple factory
- 超齐全的编程开发资源集