解题思路:
/*
** 这题中,我将任务分成了4个模块以及调用它们(其中3个)的循环框架:
** 1.str2num:将用户输入的k进制数(采用了以字符串的形式储存,因为可能输入A、a等字符)转换成整型 数组,并进行了'a' -> 10, 'b' ->11等操作
** 2.turnover:从右向左读,获得输入的k进制数的“反数”
** 3.isOrNot:判断k进制数与其“反数”的和,是否是回文数
** 4.compute:最核心的部分,进行k进制的加法运算,获得k进制数与其“反数”的和
** 思路比较简单,但因水平所限,使用的算法不好,代码实现的过程中遇到了很多问题,写的也比较复杂,不 好理解
** 代码中如果有可以化简的地方,告诉我哦!
*/
str2num:
//因为可以输入k大于10的k进制数,所以需对输入的k进制数加工 void str2num(char str[], int num[]){ int len = strlen(str); for(int i = 0; i < len; i++){ if(str[i] >= 'a' && str[i] <= 'z'){ //str[i]是小写字母 num[i] = str[i] - 'a' + 10; } if(str[i] >= 'A' && str[i] <= 'Z'){ //str[i]是大写字母 num[i] = str[i] - 'A' + 10; } if(str[i] >= '0' && str[i] <= '9'){ //str[i]是数字字符 num[i] = str[i] - '0'; } } }
turnover:
//从右向左读,将获得的“反数”存入newd数组中 void turnover(int num[], int newd[], int len){ for(int i = 0; i < len; i++){ newd[i] = num[len - 1 - i]; //num数组反序存入newd数组中 } }
isOrNot:
//判断是不是回文数 int isOrNot(int num[], int len){ int flag = 1; for(int i = 0; i < len / 2; i++){ if(num[i] != num[len - 1 -i]){ flag = 0; //若当前元素和它的镜像元素不等,flag置0 break; } } return flag; }
compute:
/* ** 这部分实现了两个功能: ** 1.获得k进制数与其“反数”的k进制和,并存入num数组里 ** 2.更新len,即加和后新的k进制数的位数 */ int compute(int num[], int newd[], int base, int len){ for(int i = 0; i < len; i++){ //num和newd初始时全部元素置为了-1,以便遍历判断num的“有效长度” if(num[i + 1] != -1){ //若当前位不是最高位 num[i + 1] += (num[i] + newd[i]) / base; //高1位进(0或1)位 } //若当前位是最高位,且num与newd当前位的和可进位1 else if(num[i + 1] == -1 && (num[i] + newd[i]) / base != 0){ num[i + 1] = (num[i] + newd[i]) / base; //位数+1,且新的最高位赋以1 } num[i] = (num[i] + newd[i]) % base; //num当前位变为。。。你懂的 } len = 0; while(num[len++] != -1); //获得和的位数 return len - 1; }
循环框架:
int step = 0; while(!isOrNot(num, len)){ step++; turnover(num, newd, len); len = compute(num, newd, base, len); if(step > 30){ printf("Impossible!\n"); return 0; } }
注意事项: 题目要求要看清楚。。。不要像我这样,看成了k进制数的十进制加法。。。
完整代码:
#include<stdio.h> #include<string.h> void str2num(char str[], int num[]){ int len = strlen(str); for(int i = 0; i < len; i++){ if(str[i] >= 'a' && str[i] <= 'z'){ num[i] = str[i] - 'a' + 10; } if(str[i] >= 'A' && str[i] <= 'Z'){ num[i] = str[i] - 'A' + 10; } if(str[i] >= '0' && str[i] <= '9'){ num[i] = str[i] - '0'; } } } void turnover(int num[], int newd[], int len){ for(int i = 0; i < len; i++){ newd[i] = num[len - 1 - i]; } } int compute(int num[], int newd[], int base, int len){ for(int i = 0; i < len; i++){ if(num[i + 1] != -1){ num[i + 1] += (num[i] + newd[i]) / base; } else if(num[i + 1] == -1 && (num[i] + newd[i]) / base != 0){ num[i + 1] = (num[i] + newd[i]) / base; } num[i] = (num[i] + newd[i]) % base; } len = 0; while(num[len++] != -1); return len - 1; } int isOrNot(int num[], int len){ int flag = 1; for(int i = 0; i < len / 2; i++){ if(num[i] != num[len - 1 -i]){ flag = 0; break; } } return flag; } int main(){ int base, num[10], newd[10]; for(int i = 0; i < 10; i++){ num[i] = -1; newd[i] = -1; } char str[10]; //输入的k进制数最大为maxlongint = 2147483647,十个数位 scanf("%d %s", &base, str); int len = strlen(str); str2num(str, num); int step = 0; while(!isOrNot(num, len)){ step++; turnover(num, newd, len); len = compute(num, newd, base, len); if(step > 30){ printf("Impossible!\n"); return 0; } } printf("STEP=%d\n", step); return 0; }
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:766 |
C二级辅导-分段函数 (C语言代码)浏览:583 |
简单的a+b (C语言代码)浏览:583 |
简单的a+b (C语言代码)浏览:564 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:632 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:1114 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:624 |
整除问题 (C语言代码)浏览:594 |
神奇的fans (C语言代码)浏览:1125 |
简单的a+b (C语言代码)浏览:497 |