这两天回老家了,耽误了两天。
1081 检查密码、射击比赛、是否存在相等的差、外观数列
思路: 简单的条件判断,注意 isalpha(), isdigit()这些ctype.h中的方法返回值是非零整数和零,而不是零和一。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define LEN 81
int main() {
int n, ch, digitFlag, alphaFlag, illegalFlag;
scanf("%d", &n);
getchar();
while(n-- > 0) {
char temp[LEN] = "";
digitFlag = alphaFlag = illegalFlag = 0;
for(int i=0; (ch=getchar())!='\n'; i++) {
temp[i] = ch;
if(isalnum(ch) || ch=='.') {/如果是合法字符
digitFlag = isdigit(ch)!=0 ? 1 : digitFlag;//更新数字标志
alphaFlag = isalpha(ch)!=0 ? 1 : alphaFlag;//更新字母标志
} else
illegalFlag = 1;//更新非法字符标志
}
if(strlen(temp) < 6)//长度不够
puts("Your password is tai duan le.");
else {
if(illegalFlag)//有非法字符
puts("Your password is tai luan le.");
else if(alphaFlag==1 && digitFlag==0)//有字母没数字
puts("Your password needs shu zi.");
else if(alphaFlag==0 && digitFlag==1)//有数字没字母
puts("Your password needs zi mu.");
else if(alphaFlag==1 && digitFlag==1)//合法密码
puts("Your password is wan mei.");
}
}
return 0;
}
1082 射击比赛
思路: 算平方和即可,不需要计算开方。
#include<stdio.h>
#define LEN 10000
int main() {
int n, min, max, minId, maxId;
max = 0;
min = 10000;
scanf("%d", &n);
while(n-- > 0) {
int x, y, id;
scanf("%d%d%d", &id, &x, &y);
x = x*x + y*y;
if(x < min) {
min = x;
minId = id;
}
if(x > max) {
max = x;
maxId = id;
}
}
printf("%.4d %.4d", minId, maxId);
return 0;
}
1083 是否存在相等的差
思路: 循环相减即可,注意 1. 是差的绝对值。 2. 要输出重复的差
#include<stdio.h>
#include<math.h>
#define LEN 10000
int main() {
int n, arr[LEN] = {0};
scanf("%d", &n);
for(int i=1; i<=n; i++) {
int x;
scanf("%d", &x);
arr[abs(x-i)]++;
}
for(int i=n-1; i>=0; i--)
if(arr[i] > 1)
printf("%d %d\n", i, arr[i]);
return 0;
}
1084 外观数列
思路; 本质是一个数字符个数的题,两个指针front rear, rear遍历字符数组,rear指向的字符与front相等,则计数器自增一,rear指向下一个字符,若不同则将front所指向的字符以及计数器的值写入结果数组中。注意,把数组设大一些 ,测试点四的结果很大。
#include<stdio.h>
#include<string.h>
#define LEN 100000
int main() {
int n;
char d[LEN];
scanf("%s %d", &d, &n);
while(n-- > 1) {
char temp[LEN] = "";
int i, front, rear, count;
front = rear = 0;
count = 1;
for(i=0; d[front]!='\0';) {
rear++;
if(d[front] == d[rear])
count++;
else {//rear 和 front 指向的字符不同
temp[i++] = d[front];//将front指向的字符写入结果数组
temp[i++] = count+'0';//将计数器的值写入结果数组
front = rear;//front指向rear
count = 1;//计数器归1
}
}
temp[i] = '\0';
strcpy(d, temp);//将结果数组拷贝到原数组中,作下一次循环
}
puts(d);
return 0;
}