取某个数字的各个位数字
输出一个十进制位的各个数字
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 ,除以当前位的权重
$$
变种问题:进制不统一
题目意思大致为,有一种货币,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);
}
}