题意:
给定 n,k的值,定义x=n^k。要求:将x的每一位上的数字相加,然后所得数为x,直到x是一位位数,即0<=x<=9,得出所得的值。
思路:
k=1,2。
(1)直接暴力循环模拟,可能是数据比较水,long long可以存1e18,所以用 long long来寻找。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ()
{
ll t;
cin>>t;
while(t--)
{
ll n,k;
cin>>n>>k;
if(k==1)
{
ll sum=0x3f3f3f3f;//先定义最大值
while(sum>9)
{
ll p=n;
sum=0;
while(p)
{
sum=sum+p%10;
p=p/10;
}
n=sum;//用n=sum来继续循环
}
cout<<sum<<endl;
}
else
{
ll sum=0x3f3f3f3f;
n=n*n;
while(sum>9)
{
ll p=n;
sum=0;
while(p)
{
sum=sum+p%10;
p=p/10;
}
n=sum;
}
cout<<sum<<endl;
}
}
return 0;
}
(2)
通过在纸上验算可以得出一个规律来:k=1时,就照常,当k=2时,先将n的每一位的值算出相加,然后*2,在之前进行k=1时的相同操作。
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int t;cin>>t;
while(t--)
{
int n,k;cin>>n>>k;
int ans=0;
if(k==1)
{
while(1)
{
int sum=0;
while(n)
{
int p=n%10;
sum=sum+p;
n=n/10;
}
ans=sum;
if(ans>=1&&ans<=9)
break;
n=sum;
}
}
else
{
int sum=0;
while(n)//先算位数之和
{
int p=n%10;
sum=sum+p;
n=n/10;
}
sum=sum*sum;//再相乘
while(1)//相同操作
{
n=sum;
sum=0;
while(n)
{
int p=n%10;
sum=sum+p;
n=n/10;
}
ans=sum;
if(ans>=1&&ans<=9)
break;
}
}
cout<<ans<<endl;
}
}