请务必列表写
#include<cstdio>int main(){int i,j,L,n,k,s,t;int b[11];scanf("%d%d",&L,&n);s = L;k = 1;t = L;while(s<n){k++;t *= L;s += t;}s -= t;n = n-s-1;for(i=1; i<=10; i++){b[i] = 0;}j = 11;while(n>0){j--;b[j] = n%L;n /= L;}for(i=10-k+1; i<=10; i++){printf("%c",'A'+b[i]);}return 0;}
输入:4 167
输出:
复制代码通过编译器运行可得到结果。
输出结果:BBAC
列表如下:
电子版本:
链接: https://pan.baidu.com/s/1a_ubStuvpsolLh_JYUykGA 提取码: 4dh2
直接将两个数带入走一遍程序就可以了
我将程序分为4个部分
第一部分从第9行开始
int L=4,n=167
s = L;
k = 1;
t = L;
while (s < n)
{
k++;
t *= L;
s += t;
}
第一部分表格:
循环前 | 第一次循环 | 第二次循环 | 第三次循环 |
---|---|---|---|
s=4 | s=20 | s=84 | s=340 |
k=1 | k=2 | k=3 | k=4 |
t=4 | t=16 | t=64 | t=256 |
n=167 | n=167 | n=167 | n=167 |
s<n条件不符合,第一部分结束
第二部分:
s -= t;
n = n - s - 1;
for (i = 1; i <= 10; i++)
{
b[i] = 0;
}
s=84
n=82
b[1-10]=0
第三部分
j = 11;
while (n > 0)
{
j--;
b[j] = n % L;
n /= L;
}
循环前 | 第一次循环 | 第二次循环 | 第三次循环 | 第四次循环 |
---|---|---|---|---|
j=11 | j=10 | j=9 | j=8 | j=7 |
n=82 | n=20 | n=5 | n=1 | n=0 |
b[j]=-- | b[j]=2 | b[j]=0 | b[j]=1 | b[j]=1 |
n=0跳出循环
n除有余数时会赋值为商,而非四舍五入
此时b数组的情况:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
未赋值 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 2 |
此时k的作用也就知道了,就是算出有效的数个数
而b数组把所有值放在末尾储存,所以可以算出第一个有效值的位置
然后输出
第四部分
for (i = 10 - k + 1; i <= 10; i++)
{
printf("%c", 'A' + b[i]);
}
i的值 | 7 | 8 | 9 | 10 |
---|---|---|---|---|
b[i]的值 | 1 | 1 | 0 | 2 |
输出结果 | B | B | A | C |