user-0 提问: 关于连续k进制输出的一段代码

回复:
user: user-0
content: 引用 3 楼 qzjhjxj 的回复:供参考：#include <stdio.h> #include <string.h> #define exchange(a,b) t=a,a=b,b=t char t; void change(char a[]) {     int start=0,end;     int len;     len=strlen(a);     end=len-1;     while(start<end)     {         exchange(a[start],a[end]);         start++;         end--;     } } void reprintf(char a[],int len) {     len--;     while(len >= 0)         printf("%c",a[len--]);     printf("\n"); } void main() {     char n[128];     gets(n);           // 123456789     int m,k;           // 10 3     scanf("%d%d",&k,&m);     int s;     change(n);        //将输入字符串数n高低位逆序，低位排在前，高位在后 987654321     for(s=0; s<m; s++)//数n之后的m个数，这里m=3     {         int carry = 1;//数n之后的m个数，初始都是在原数上 +1         int pos = 0;  //数位游标从0位开始         while(n[pos])//从低位9开始，直到字符串数组n结束 =='\0'  987654321'\0'         {             n[pos]+=carry;     //低位 9 先加1             if(n[pos] == '0' + k) //如果到达进制数k值,这里k是int型，n[0]为char型，将k转为字符型+'0'             {                 n[pos]= '0'; //n[pos]归零                 carry = 1;   //进位为1             }             else             {                 carry=0;//没有进位，进位为0             }             pos++;  //下一位数值 8         }         if(carry)   //如果最后进位为1，在最高位置1             n[pos++]= '1';         n[pos] =0;  //在n尾部写入字符串结束标志  097654321'\0'          reprintf(n,pos);//将字符串n数组逆序输出 123456790     } }  //123456789  //10 3 //987654321 //123456790 //123456791 //123456792 //请按任意键继续. . . 写的很详细，已经看懂啦，谢谢！

user: user-0
content: 引用 1 楼 user-2 的回复:就是把输入的字符串先左右反过来，目的是为了方便它进位变长。 然后加一的操作当然是要加在原本的最低位也就是“个位”上，然而现在它在最左端，下标最小那个。 加法逢k进一呀，carry就是进位那个1，往高位上加，现在就是往下一位上加。 pos就没什么了，你就当他是循环变量i就好了。谢谢，懂了

user: user-1
content: 供参考：#include <stdio.h> #include <string.h> #define exchange(a,b) t=a,a=b,b=t char t; void change(char a[]) {     int start=0,end;     int len;     len=strlen(a);     end=len-1;     while(start<end)     {         exchange(a[start],a[end]);         start++;         end--;     } } void reprintf(char a[],int len) {     len--;     while(len >= 0)         printf("%c",a[len--]);     printf("\n"); } void main() {     char n[128];     gets(n);           // 123456789     int m,k;           // 10 3     scanf("%d%d",&k,&m);     int s;     change(n);        //将输入字符串数n高低位逆序，低位排在前，高位在后 987654321     for(s=0; s<m; s++)//数n之后的m个数，这里m=3     {         int carry = 1;//数n之后的m个数，初始都是在原数上 +1         int pos = 0;  //数位游标从0位开始         while(n[pos])//从低位9开始，直到字符串数组n结束 =='\0'  987654321'\0'         {             n[pos]+=carry;     //低位 9 先加1             if(n[pos] == '0' + k) //如果到达进制数k值,这里k是int型，n[0]为char型，将k转为字符型+'0'             {                 n[pos]= '0'; //n[pos]归零                 carry = 1;   //进位为1             }             else             {                 carry=0;//没有进位，进位为0             }             pos++;  //下一位数值 8         }         if(carry)   //如果最后进位为1，在最高位置1             n[pos++]= '1';         n[pos] =0;  //在n尾部写入字符串结束标志  097654321'\0'          reprintf(n,pos);//将字符串n数组逆序输出 123456790     } }  //123456789  //10 3 //987654321 //123456790 //123456791 //123456792 //请按任意键继续. . .

user: user-2
content: 你看不懂大约是因为carry搞了个兼职，每次整体加一加到最低位上，这个1也由它表达了，反正最低位没有下面进上来的，闲着也是闲着。

user: user-2
content: 就是把输入的字符串先左右反过来，目的是为了方便它进位变长。 然后加一的操作当然是要加在原本的最低位也就是“个位”上，然而现在它在最左端，下标最小那个。 加法逢k进一呀，carry就是进位那个1，往高位上加，现在就是往下一位上加。 pos就没什么了，你就当他是循环变量i就好了。