您的位置:首页 > 其它

杭电1061 Rightmost Digit

2017-10-01 12:53 232 查看
这一题一开始我想的挺简单的。一看题目直接动手写了。然后就写了下面的代码

#include <iostream>
using namespace std;
int main()
{
int m;
cin >> m;
while (m)
{
int n,re=1;
cin >> n;
for (int i = 0; i < n;i++)
{
re *= n;
}
cout << re%10 << endl;

}
return 0;
}


VS中运行基本没有任何问题,以为这一题就这么简单的结束了。放进去一运行出现了Time Limit Exceeded。发现自己还是错了。然后再网上看看大神怎么做。最后发现这一题原来是要用 模幂运算。然后查看了取模运算的性质。

(a * b) % p = (a % p * b % p) % p

这个运算。这样不就可以进行递归运算了。

#include<iostream>
using namespace std;
/*
int fun(int a, int b, int c)
{

if (b == 0)
{
return 1;
}
else
{
if (b%2==0)
{
return fun(a, b / 2, c)*fun(a, b / 2, c) % c;
}
else
{
return a*fun(a, b - 1, c) % c;
}
}
}
int main()
{
int m, n;
cin >> m;
while (m)
{
cin >> n;
cout << fun(n, n, 10) << endl;
m--;
}
return 0;
}*/


最后发现还是Time Limit Exceeded。也不知道啥情况。最后只能弄非递归的方法写一写

#include <iostream>
using namespace std;
int fun(int a, int b, int c)
{
int res = 1;
a = a%c;
while (b)
{
if (b & 1)
{
res = res*a%c;
--b;
}
else        {
a = a*a%c;
b =b/2;
}
}
return res;
}
int main()
{
int m, n;
cin >> m;
while (m)
{
cin >> n;
cout << fun(n,n,10) << endl;
m--;
}
return 0;
}


最后就运行成功了。这一题还是有一些小弯路的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: