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;
}