Mark11


私信TA

用户名:Mark11

访问量:26457

签 名:

懒惰,傲慢,愤怒

等  级
排  名 364
经  验 5240
参赛次数 0
文章发表 47
年  龄 20
在职情况 学生
学  校 NorthWest University
专  业 S.E

  自我简介:

从头来过的苦逼

解题思路:

/*

 ** 这题中,我将任务分成了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 人评分

  评论区

  • «
  • »