Rightmost Digit
http://acm.hdu.edu.cn/showproblem.php?pid=1061
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
Problem 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
Hint
找规律吧:
基本代码:
/*0ms,228KB*/
#include<cstdio>
int y;
int ans(int temp)
{
switch (temp)
{
case 0:
return 0;
case 1:
return 1;
case 2:
y %= 4;
if (y == 0)
y = 4;
switch (y)
{
case 1:
return 2;
case 2:
return 4;
case 3:
return 8;
case 4:
return 6;
}
case 3:
y %= 4;
if (y == 0)
y = 4;
switch (y)
{
case 1:
return 3;
case 2:
return 9;
case 3:
return 7;
case 4:
return 1;
}
case 4:
y %= 2;
if (y == 0)
y = 2;
switch (y)
{
case 1:
return 4;
case 2:
return 6;
}
case 5:
return 5;
case 6:
return 6;
case 7:
y %= 4;
if (y == 0)
y = 4;
switch (y)
{
case 1:
return 7;
case 2:
return 9;
case 3:
return 3;
case 4:
return 1;
}
case 8:
y %= 4;
if (y == 0)
y = 4;
switch (y)
{
case 1:
return 8;
case 2:
return 4;
case 3:
return 2;
case 4:
return 6;
}
case 9:
y %= 2;
if (y == 0)
y = 2;
switch (y)
{
case 1:
return 9;
case 2:
return 1;
}
}
}
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &y);
int temp = y % 10;
printf("%d\n", ans(temp));
}
return 0;
}
更好的规律:
/*0ms,228KB*/
#include<cstdio>
const int ans[20] = { 0, 1, 4, 7, 6, 5, 6, 3, 6, 9, 0, 1, 6, 3, 6, 5, 6, 7, 4, 9 };
int main(void)
{
int T, N;
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
printf("%d\n", ans[N % 20]);
}
}
规律的综合公式:
/*0ms,228KB*/
#include <cstdio>
int main(void)
{
int t, n, p, sum;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
p = n % 10;
sum = p;
for (int i = 0; i < (n + 3) % 4; i++)
sum *= p;
printf("%d\n", sum % 10);
}
return 0;
}