问题描述,管理员是单身狗,在给一段数列排序时,见到含有1就不爽,所以逢1就进位
样例:
1 2 3 4 5 6 7 8 9 10 11 12 。。。。。。 100 101 102 103 104
管理员的记录:
若含有0情况
0 2 3 4 5 6 7 8 9 20 22 23 24 。。。。 99 200 202
输入:1
输出:2
输入:11
输出:23
#include <stdio.h> #include <string.h> char str[1000];//输入字符串 int start[1000],ans[1000],res[1000]; //被除数,商,余数 //转换前后的进制 const int oldBase = 10; const int newBase = 9; void change() {//各个数位还原为数字形式 int i,len = strlen(str); start[0] = len; for(i=1;i<= len;i++) { if(str[i-1] >= ‘0‘ && str[i-1] <= ‘9‘) { start[i] = str[i-1] - ‘0‘; } } } void solve() { memset(res,0,sizeof(res));//余数初始化为空 int y,i,j; //模n取余法,(总体规律是先余为低位,后余为高位) while(start[0] >= 1) {//只要被除数仍然大于等于1,那就继续“模2取余” y=0; i=1; ans[0]=start[0]; // while(i <= start[0]) { y = y * oldBase + start[i]; ans[i++] = y/newBase; y %= newBase; } res[++res[0]] = y;//这一轮运算得到的余数 i = 1; //到下一轮商的起始处 while((i<=ans[0]) && (ans[i]==0)) i++; //清除这一轮使用的被除数 memset(start,0,sizeof(start)); //本轮得到的商变为下一轮的被除数 for(j = i;j <= ans[0];j++) start[++start[0]] = ans[j]; memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备 } } void output() {//从高位到低位逆序输出 int i; int num[9]={0,2,3,4,5,6,7,8,9}; for(i = res[0];i >= 1;--i) { printf("%d",num[res[i]]); } printf("\n"); } int main() { scanf("%s",str); change(); solve(); output(); return 0; }
总结问题,个人思想,其实这是一个数的进制转换问题,数列中只有,0,2,3,4,5,6,7,8,9也就是说只有9位,
这是一个10进制转换到9进制问题,我们设立一个数组num[9];对应输入0到9即可,然后问题简化为大数除以一位数问题!
问题就简单了。会大数进制转换即可。
时间: 2024-11-16 06:22:26