取某个数字的各个位数字

[TOC]

输出一个十进制位的各个数字

int a = 123;
printf("%d %d %d",a/100,a/10%10,a%10);

拓展到更一般的情况,一个十进制数字的每一位应该是
$$
\frac a{10^n} %10 ,除以当前位的权重
$$

如果是K进制,则应该是:
$$
\frac a{K^n} %K ,除以当前位的权重
$$

变种问题:进制不统一

1058.A+B in Hogwarts

题目意思大致为,有一种货币,29个Knut等于1个Sickle,1个Sickle等于17个Galleon,如何将Kunt向上转化为其他单位

int a = 123;
printf("%d %d %d",a/(29*17),a/17%29,a/29);

该三位数的权重分别是**29*17,29,1**,所以:

printf("%d %d %d",a/(29*17),a/29%17,a%29);

第一位不用再%29因为其上再没有别的单位

变种问题:取一个数任意连续几位

取12345678中的12,345,678

思路大致是这样的:可将原数字每三位划分,(12)(345)(678),每个括号内等同于一位,该数的进制即为1000,根据前面的原理,可以写出:

printf("%d %d %d",a/1000000,a/1000%1000,a%1000);

因此,例如下面的问题,就有了更简单的解
1001.A+B Format

#include <cstdio>
#include <cstring>
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    int c = a + b;
    if(c < 0){
        printf("-");
        c *= -1;
    }
    if(c >= 1000000){
        printf("%d,%03d,%03d",c/1000000,c/1000%1000,c%1000);
    }else if(c >= 1000){
        printf("%d,%03d",c/1000,c % 1000);
    }else{
        printf("%d",c);
    }
}

猜你喜欢

转载自www.cnblogs.com/amojury/p/9001230.html