这个题的思路很简单,但是细节容易出错,可用循环或递归实现(用空间换时间)!(提交数据显示:递归比循环快3ms)
点击此处查看题目
完整代码:
法1(用循环实现):
#include <iostream> #include <cstdio> using namespace std; int t,n,k; int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); long long x,y=0,f=1; for(int i=0;i<k;i++) { f*=n; } x=f; while(x>9) { y=0;//每次计算新的数的时候y一定要初始化! while(x) { y+=x; x/=10; } x=y; } printf("%lld\n",x); } return 0; }
法2(用递归实现):
#include <iostream> #include <cstdio> using namespace std; int t,n,k; long long password(long long x,long long y) { y+=x; x/=10; if(x==0) { x=y; if(x<=9) { return x; } else{ return password(x,0); } } else{ return password(x,y); } } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); long long x,f=1; for(int i=0;i<k;i++) { f*=n; } x=f; long long ans=password(x,0); printf("%lld\n",ans); } return 0; }
