题目链接:点击打开链接
题意大概是给你一个数 n 和 m,找出在0~n中能被 n 整除的数,然后讲这些数字转化成 m 进制,转成后将 m 进制数字上的每个数字平方后相加,得到 一个和 sum ,最后再将 sum转化成 m 进制,sum 转化的 m 进制数字即为输出结果;
例如:
n = 10,m =2;
找出 0~n 以内的约数为 1,2,5,10; 将这些数字转化成2进制为1,10,101,1010;之后各二进制上的数字平方相加 sum = 1^2+1^2+0^2+1^2+0^2+1^2+1^2+0^2+1^2+0^2=1+1+0+1+0+1+1+0+1+0=6,即sum = 6;最后将sum 转化成2进制即为输出结果,输出结果为110;
注意:找0~n以内能被n整除的数的时候,应该用到sqrt(n)用 n 除以0~sqrt(n)以内能被n整除的数,可以得出sqrt(n)~n以内能被 n 整除的数,如果用 n 而不用sqrt(n)的话,最后会超时(这我深有体会,你懂的);
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
typedef long long ll;
int change(int n,int base)
{
int sum=0;
while(n){
sum+=(n%base)*(n%base);
n=n/base;
}
return sum;
}
int main()
{
int n,base;
while(cin>>n>>base){
char a[100];
int sum=0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
sum+=change(i,base);
if(n/i!=i){
sum+=change(n/i,base);
}
}
}
int cnt=0;
while(sum){
int t=sum%base;
if(t<10) a[cnt++]=t+48;
else if(t>=10)
a[cnt++]='A'+t-10;
sum=sum/base;
}
for(int i=cnt-1;i>=0;i--)
cout<<a[i];
cout<<endl;
}
return 0;
}