题意:输入n、m,将n的所有因数转化成m进制的数,并将转化后的每一位数字的平方和加起来,再将这个和转化成m进制的数输出
解题思路:模拟.用vector容器分别存储因数和转化后的数,这里需要注意的是求n的因数时不能直接遍历1~n,会超时,可以遍历1~sqrt(n),每次加入两个因数,节省时间,但是要特判如果n是某个数的平方,就直接加入这一个数字即可,不然会重复加入。还要注意的就是如果转化后的数字>=10&&<=15,就要变成对应的A~E,不然就会出错
代码:
#include <iostream> #include <algorithm> #include <string> #include <cstring> #include <cmath> #include <cstdio> #include <vector> using namespace std; typedef long long ll; ll n,m,sum; vector<ll> v1,v2; void solve(ll x) { for(ll i=1; i*i<=x; i++) { if(x%i==0&&i*i<x){v1.push_back(i);v1.push_back(x/i);} else if(x%i==0&&i*i==x)v1.push_back(i);//防止i加入两次 } } void change(ll x,ll k) { v2.clear(); while(x) { ll a=x%k; x/=k; v2.push_back(a); } } int main() { while(scanf("%I64d%I64d",&n,&m)==2) { v1.clear(); sum=0; solve(n); for(ll i=0; i<v1.size(); i++) { change(v1[i],m); for(int i=0; i<v2.size(); i++) { sum+=v2[i]*v2[i]; } } change(sum,m); for(int i=v2.size()-1; i>=0; i--) { if(v2[i]>=10&&v2[i]<=15)printf("%c",v2[i]-10+'A');//转成字母 else printf("%I64d",v2[i]); } cout<<endl; } return 0; }