问题描述
给定一个正整数N,
您应该输出N^N 中最右边的数字。
输入
输入包含几个测试用例。输入的第一行是一个整数T,它是测试用例的数量。接下来是T个测试用例。每个测试用例都包含一个正整数***N(1<=N<=100000000)***。
输出
对于每个测试用例,您应该输出N^N的最右边的数字。
样本输入
2
3
4
样本输出
7
6
[提示]
在第一种情况下,333=27,所以最右边的数字是7。
在第二种情况下,444*4=256,所以最右边的数字是6。
以下是第一种写法
快速幂,
而原因是n值范围太大,一般类型数据根本存放不了,因此利用取余,从而使数值变小,并且,可以保证所需要的结果不变,至于为什么,我以前也是纠结了很久,为什么取余之后相乘依旧可以的到结果呢,直到后来,知道这个公式,经过推论可知,无论是先乘还是先取模结果是一样的
公式:(ab)modc=[(a modc)∗(b modc)]modc
# include <stdio.h>
int mul (int a)
{
int b=a;//保留下来原数,不可改变
int p=10;
int ans=1%p;
for(;a;a>>=1)//a二进制数向后移一位
{
if(a&1)//取二进制位最后一位
ans = (long long)ans*b%p;
b = (long long)b*b%p;
}return ans;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,x;
scanf("%d",&a);
x = mul(a);
// x=x%10;
printf("%d\n",x);
}
}
以下是第二种写法(来自哥们的提醒~)
就是找到了规律20个数一循环,贼省时间,就是自己计算费神,
#include<stdio.h>
int main()
{
int T,n;
int a[25]={0,1,4,7,6,5,6,3,6,9,0,1,6,3,6,5,6,7,4,9,0};
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",a[n%20]);
}
return 0;
}