题意:输入一个数n,求出它的所有因数,并将所有因数转换为m进制,在m进制下将各个位上的数字求平方和,最后将平方和以m进制输出。
#include<cstdio>
using namespace std;
int div[100], divCnt;
char divs[100][100];
char numToCh[200];
int chToNum[200];
void init()
{
int i, j;
for(i = 0; i < 10; i++)
{
numToCh[i] = i + '0';
chToNum[i+'0'] = i;
}
for(i = 10, j = 0; i < 16; i++, j++)
{
numToCh[i] = 'A' + j;
chToNum['A'+j] = i;
}
}
void trans(long long num, int base, char s[])
{
if(num == 0)
{
s[0] = '0';
s[1] = '\0';
return;
}
int index = 0;
while(num)
{
s[index++] = numToCh[num % base];
num /= base;
}
for(int i = 0, j = index - 1; i < j; i++, j--)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
s[index] = '\0';
}
int main()
{
int n, m;
init();
while(scanf("%d%d",&n,&m) != EOF)
{
int i, j;
divCnt = 0;
for(i = 1; i * i < n; i++)
if(n % i == 0)
{
div[divCnt++] = i;
div[divCnt++] = n / i;
}
if(n == i * i) div[divCnt++] = i;
for(i = 0; i < divCnt; i++)
trans(div[i], m, divs[i]);
long long sum = 0;
for(i = 0; i < divCnt; i++)
for(j = 0; divs[i][j]; j++)
sum += chToNum[divs[i][j]] * chToNum[divs[i][j]];
char ret[100];
trans(sum, m, ret);
printf("%s\n",ret);
}
return 0;
}