【机试】2015华科机试题【纯C实现】

2015年华科机试题

pro01,验证电话号码

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100+5
#define LL_MAX ((1LL<<63)-1)
#define ll long long
#define mem(a, n) memset(a, n, sizeof(a))

/// pro01, 验证电话号码
/**
1.输入一串字符,并验证其是否为正确的电话号码。
长度必须为 11 位
第一位必须为 1,第二位为 3、5、6、8 中得一个,其余位必须为 0-9 中的一个数。
*/
int main() {
    freopen("dataIn.txt", "r", stdin);
    char str[MAXN];
    while(gets(str)!=NULL) {
//        getchar();
        int len = strlen(str);
        if(len!=11) {
            printf("It's a wrong phone number!");
            continue;
        }
        int i, flag=0;
        for(i=0; i<len; i++) {
            if(i==0 && str[i]!='1') {
                flag = 1;
                break;
            } else if(i == 1 && (str[i]!='3'&&str[i]!='5'&&str[i]!='6'&&str[i]!='8')){
                flag = 1;
                break;
            } else if(i > 1 && (str[i]<'0' || str[i] >'9')) {
                flag = 1;
                break;
            }
        }
        printf("It's a %s phone number!\n", flag ? "wrong" : "right");
    }
    return 0;
}

pro02,

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100+5
#define LL_MAX ((1LL<<63)-1)
#define ll long long
#define mem(a, n) memset(a, n, sizeof(a))

/**
2.无冗余的输入两个字符串,并对其进行拼接,
1)输出拼接后的字符串。例如,string buff stringbuff
2)对于拼接后的字符串,输出奇数下标组成的子串和偶数下标组成的子串。 例如,srnbf tiguf
3)对于奇数下标组成的子串以及偶数下标组成的子串进行排序。例如 bfnrs fgitu

分析:注意题目要求无冗余输入字符串,对于无冗余即“用多少空间分配多少空间”,故用malloc
*/
char str1[MAXN], str2[MAXN];
int cmp(const void* a, const void* b) {
    return *(char *)a - *(char*)b;
}

int main() {
    freopen("dataIn.txt", "r", stdin);
    char *str=(char*)malloc(sizeof(char));
    char *str1=(char*)malloc(sizeof(char));
    char *str2=(char*)malloc(sizeof(char));
    while(~scanf("%s %s", str1, str2)) {
        strcpy(str, str1);
        strcat(str, str2);
        puts(str); //拼接后的字符串
        char res1[MAXN]={0}, res2[MAXN]={0};
        int i, len=strlen(str), num1=0, num2=0;
        for(i=0; i<len; i++) {
            if(i%2==0) { // 奇数下标
                res1[num1++] = str[i];
            } else {
                res2[num2++] = str[i];
            }
        }
        puts(res1);
        puts(res2);
        qsort(res1, num1, sizeof(res1[0]), cmp);
        puts(res1);
        qsort(res2, num2, sizeof(res2[0]), cmp);
        puts(res2);
    }
    return 0;
}

pro03,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/** 由于此题看到网上某些地方写无冗余的时候会有用到 malloc+realloc的写法, 那么我就用这些写法都写了一遍。我的写法是使用malloc动态分配内存,用scanf("%s",str); 输入字符串然后进行处理即可。 通过以上几张截图可以看出malloc和malloc+realloc没有什么不同,其实根据C语言参考手册等资料可以知道两者都可以实现动态分配内存,只是realloc可以对原有字符串str进行重新分配内存空间,它有两个参数,若第一个参数为NULL,其功能与malloc相同。
也有些地方你可以看到用free()释放分配的内存空间,个人认为在一般的算法训练赛或者人工测试中是可以不写的,当然写了也很好。若是在工程项目中还是写上为好,避免出现内存泄露之类的问题。
故最后给出我的结论:一般的算法题或训练赛,为简便起见,不用free(),关于无冗余输入使用malloc()分配内存空间,然后从控制台或者文件读入即可。
个人见解,有不妥之处希望留言交流,谢谢~
*/
/**
3.无冗余的输入一个字符串
1)输出该字符串
2)对于不是首次出现的字符,对其进行过滤,例如 abcdacdef,过滤后为 abcdef
3)对于字符 0-9,A-F,a-f,将其对应的 ASCII 码的低 4 位进行对调,例如将 1011,转 换为 1101,并将对应的 ACSII 码对应的字符输出,若为字母,转换为大写。
*/

int flag[MAXN];
int judge(char ch) {
    if((ch>='0'&&ch<='9') || (ch>='a'&&ch<='z') || (ch>='A'&&ch<='F')) return 1;
    return 0;
}
char change(char ch) {
    int bina[100]={0};
    int i, tmp=ch, cnt=0;
//    printf("tmp=%d\n",tmp);
    while(tmp) {
        bina[cnt++] = tmp%2;
        tmp /= 2;
    }
    //对调低4位
    int tmp1=bina[0], tmp2=bina[1];
    bina[0]=bina[3], bina[1]=bina[2];
    bina[3]=tmp1, bina[2]=tmp2;
    int res=0;
    for(i=cnt-1; i>=0; i--) {
        res=res*2+bina[i];
//        printf("%d", bina[i]);
    }
    char ans = (char)res;
    if(isalpha(ans)){
        putchar(ans);
    }
//    printf("\nres=%d  ans=%c\n", res, ans);
}
void solve_pro3(char *str) {
    int i;
    for(i=0; str[i]; i++) {
        if(judge(str[i])) { ///符合(3)中的字符要求
            change(str[i]);
        }
    }
    puts("");
}
int mylen(const char *s){
    char *str = (char*)s;
    while(*str++);

    return str - s - 1;
}
int main() {
    int i=1;
    char ch;
//    char str[20];
    char *str = (char*) malloc( sizeof(char) );
    scanf("%s", str);
//    while((ch=getchar()) != '\n'){ // 以换行符为结束标志
//        str = (char*) realloc(str, sizeof(char)*i);
//        *(str+i-1) = ch;
//        i++;
//    }
//    str = (char*) realloc(str, sizeof(char)*i);
//    *(str+i-1) = '\0'; // 结束符
//    printf("len = %d\n", mylen(str));
    mem(flag, 0);
    puts(str);  ///(1)
    for(i=0; str[i]; i++) { /// (2)
        if(flag[(int)str[i]] == 0) {
            putchar(str[i]);
            flag[(int)str[i]]=1;
        }
    }
    puts("");
    solve_pro3(str); //(3)
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值