B - Sum of divisors HDU - 4432

11 篇文章 0 订阅

题目链接:点击打开链接

题意大概是给你一个数 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值