問題描述,管理員是單身狗,在給一段數列排序時,見到含有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即可,然後問題簡化爲大數除以一位數問題!
問題就簡單了。會大數進制轉換即可。