PAT (Basic Level) Practice

1001:害死人不偿命的(3n+1)猜想 (15)(完成)

#include<iostream>
using namespace std;

int main(){
  int n,a=0;
  scanf("%d",&n);
  while(n!=1){
    if(n%2==0){
      n/=2;
    }
    else{
      n=(3*n+1)/2;
    }
  a++;
  }
  printf("%d",a);
  return 0;
}

 

1002:写出这个数 (20)(完成)

注意要点:

1.字符串数组的使用。使用方式:点击打开链接

2.sprint的使用。点击打开链接

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//有两个点:1.sprintf的使用。2.可以一边输入一边直接累加。//
char s[100];
char ans[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main(){
    char ch;
    int sum=0;
    while((ch=getchar())!='\n'){
      sum+=(ch-'0');
    }
    sprintf(s,"%d",sum);
    for(int i=0;s[i]!=0;i++){
      if(i>0){
        printf(" ");
      }
      printf("%s",ans[s[i]-'0']);
    }
    return 0;
}

 

1003:我要通过! (20 分)(AC:模拟)

注意要点:

完了补吧。第一个卡了好久。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int n;
	scanf("%d" , &n);
	for(int i = 0 ;i < n ; i ++){
		string s;
		int a = -1000, b = -1000 , c = -1 , d = -1 , pcount = 0 , tcount = 0;;//d的值控制j的下标 // 
		cin >> s;
		for(int j = 0 ; j < s.size() ; j ++){
			//判断所有的满足和不满足的字母// 
			if(s[j]!= 'P'){
				if(s[j] != 'A'){
					if(s[j] != 'T'){
						break;
					}
					else{
						tcount ++;
					}
				}
			}
			else{
				pcount ++;
			}
			
			if(s[j] == 'P'){// 记录第一个a的数值// 
				a = j;
			}
			if(s[j] == 'T'){// 记录第一个b的数值// 
				b = j - a - 1;
				d = j;
			}
		}
		c = s.size() - d - 1 ;//记录c的数值// 
		if(a * b == c && b > 0 && pcount == 1 && tcount == 1){//p和t的个数只能出现一次。a和b的个数需要拉的大一点,要不然容易出毛病。// 
			printf("YES");
		}
		else{
			printf("NO");
		}
		if(i != n - 1){
			printf("\n");//最后一行不打印// 
		}
	}
	return 0;
}

 

1004:成绩排名 (20)(完成)

注意要点:

1.结构体的编程格式。

#include<iostream>
using namespace std;

struct student{
  char name[15];
  char num[15];
  int grade;
}stu,M,m;
//这个地方有个技巧:我们不必把所有信息都输进去。我们只是判断最大值和最小值。//
int main(){
  int n,max=0,min=101;
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%s %s %d",stu.name,stu.num,&stu.grade);
    if(stu.grade>max){
      max=stu.grade;
      M=stu;
    }
    if(stu.grade<min){
      min=stu.grade;
      m=stu;
    }
  }
  printf("%s %s\n",M.name,M.num);
  printf("%s %s",m.name,m.num);
  return 0;
}

 

1005:继续(3n+1)猜想 (25)(AC)

注意要点:

1.这题目是写的真是令人绝望。sum放在里面死活都不对,一拉到外面就全对了,你是不是坑爹了。

#include<iostream>
using namespace std;
int main() {
	int N , b , sum = 0;
	int a[10005] = { 0 };
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i++) {
		scanf("%d" , &b);
		if(a[b] == 2);
		else	a[b] = 1 ;
		while(b != 1) {
			if(b % 2 == 0) b /= 2;
			else 	b = (3 * b + 1) / 2;
			a[b] = 2;
		}
	}
	for(int i = 0 ; i < 10000; i ++) {
		if(a[i] == 1) sum ++;//放在外面的sum// 
	}
	for(int i = 10000; i >= 0 ; i --) {
		if(a[i] == 1) {
			printf("%d" , i);
			sum--;
			if(sum > 0) printf(" ");	//再次注意这个写法。//
		}
		
	} 
	return 0;
}

 

1006:换个格式输出整数 (15)(完成)

注意要点:

1. 新C++中不再支持gets,需要换回C了。

#include<stdio.h>

char s[10];

int main(){
  int len;
  gets(s);
  len=strlen(s);
  if(len==1){
    for(int i=1;i<=(s[0]-'0');i++){
      printf("%d",i);
    }
  }
  if(len==2){
    for(int i=1;i<=(s[0]-'0');i++){
      printf("S");
    }
    for(int i=1;i<=(s[1]-'0');i++){
      printf("%d",i);
    }
  }
  if(len==3){
    for(int i=1;i<=(s[0]-'0');i++){
      printf("B");
    }
    for(int i=1;i<=(s[1]-'0');i++){
      printf("S");
    }
    for(int i=1;i<=(s[2]-'0');i++){
      printf("%d",i);
    }
  }
  return 0;
}

 

1007: 素数对猜想 (20)(完成)

注意要点:

1.埃氏筛法的写法。

2.在一开始定义的时候最好都能定义成一致的。

#include<iostream>
using namespace std;

int a[100005],primeNum=0;
bool flag[100005]={0};

//素数技巧:埃氏筛法//
void prime(int c){	
	for(int i=2;i<=c;i++){
    if(flag[i]==0){  
    	a[primeNum++]=i;
      	for(int j=i+i;j<=c;j+=i){
        	flag[j]=1;
      	}
    }
  }
}

int main(){
  int n,ans=0;
  scanf("%d",&n);
  prime(n);
  for(int i=0;i<primeNum;i++)
    if(a[i+1]-a[i]==2)
      ans++;
  printf("%d",ans);
  return 0;
}

 

1008:数组元素循环右移问题 (20)

注意要点:

1.什么鬼,这个题目真的佛了,这个点100%想不到。比如说 ,我左移九位,其实等于转了一圈,只是往左移了一位。

#include<iostream>
using namespace std;

int main(){
	int n , m;
	int a[105] = {0};
	scanf("%d%d" , &n , &m);
	m = m % n;//这个是在等比例缩小// 
	for(int i = 0 ; i < n ; i ++) {
		scanf("%d" , &a[i]);
	}
	for(int i = n - m ; i < n ; i ++) {
			printf("%d " , a[i]);
	}
	for(int i = 0 ; i < n - m ; i ++) {
		if(i == n - m - 1) printf("%d" , a[i]);
		else printf("%d " , a[i]);
	}
	return 0;
}

 

1009:说反话 (20)(完成)

注意要点:

1.在EOF下需要手动更新数值。ctrl+z

#include<iostream>
using namespace std;
//利用字符串数组解决问题。//
int main(){
  char s[85][85];
  int i=0;
  while(scanf("%s",s[i])!=EOF){
    i++;
  }
  int n=i;
  for( i=n-1;i>=0;i--){
    if(i<n-1){
      printf(" ");
    }
    printf("%s",s[i]);
  }
  return 0;
}

 

1010:一元多项式求导 (25) (AC)

注意要点:

1.行末没有空格这种要求怎么办?可以设置一个计数器先--,判断这个值只要不是0,就输出一个空格。

2.注意数组空间。但凡涉及到两个数字的关系的时候,考虑数组。

 3.还要注意EOF的用法。同时此题目也可用=2来做。

#include<iostream>
using namespace std;
int main() {
	int a[10005] = { 0 }; 
	int n1 , n2, count = 0;
	while(scanf("%d%d" , &n1 , &n2) != EOF) {
		a[n2] = n1; 
	}
	a[0] = 0;
	for(int i = 1 ; i <= 1000 ; i ++) {//空间报错// 
		a[i-1] = a[i] * i ;
		a[i] = 0 ;//更新完后的数值必须舍弃,否则倒着输出会有问题出现// 
		if(a[i - 1] != 0)	count ++;
	}
	if(count == 0)	printf("0 0");
	else {
		for(int i = 1000 ; i >=0 ; i --) {
			if(a[i] != 0) {
				printf("%d %d" , a[i] , i);
				count --; 
				if(count != 0)	printf(" ");//行末没有多余的空格的标准写法// 
	    	}
        }
	}
	return 0;
} 

 

1013:数素数 (20)  (完成)

注意要点:

1. 还有一个地方没有改对。不知道为什么。(这就是一个打表,注意输出的问题。)

#include<iostream>
using namespace std;

const int maxn=10005;
int prime[maxn],pNum=1;
bool p[maxn]={0};

void Find_prime(int b){
    for(int i=2;i<maxn;i++){
      if(p[i]==false){
        prime[pNum++]=i;
        
        for(int j=i+i;j<maxn;j+=i){
          p[j]=true;
        }
      }
    }
}
int main(){
  int a,b,i=1;
  scanf("%d%d",&a,&b);
  Find_prime(b);
  for( ;a<=b;a++){
  	if(i%10==1) printf("%d",prime[a]);
  	else        printf(" %d",prime[a]);
	if(i==10) {printf("\n");i=1;continue;}
    i++;
  }
  return 0;
}

修正之后的版本:有几个地方擅自修改了,结果答案错了。一脸懵逼。

#include<iostream>
using namespace std;

const int maxn=1000005;
int prime[maxn],pNum=0;
bool p[maxn]={0};

void Find_prime(int b){
    for(int i=2;i<maxn;i++){
      if(p[i]==false){
        prime[pNum++]=i;
        if(pNum>=b) break; 
        for(int j=i+i;j<maxn;j+=i){
          p[j]=true;
        }
      }
    }
}
int main(){
  int a,b,i=0;
  scanf("%d%d",&a,&b);
  Find_prime(b);
  for(int k=a;k<=b;k++){//这些地方能不要省就不要省,容易错// 
  	printf("%d",prime[k-1]);
  	i++;
  	if(i%10!=0 && k<b)	printf(" ");
	else printf("\n");
  }
  return 0;
}

 

1017:A除以B (20)(20 分)(完成)

注意要点:

1.大数计算。注意三板斧,前两板斧都是套路,最后一板斧变化一下即可。

#include<iostream>
#include<cstring>
using namespace std;

int r=0;

struct bign{
  int d[1000];
  int len;
  bign(){
    len=0;
    memset(d,0,sizeof(d));
  }
};

bign change(char c[]){
  bign a;
  a.len = strlen(c);
  for(int i=0;i<a.len;i++){
    a.d[i]=c[a.len-i-1]-'0';
  }
  return a;
}

bign divide(bign A,int b,int &r){
  bign ans;
  ans.len = A.len;
  for(int i=A.len-1;i>=0;i--){
    r = r * 10 +A.d[i];
    if(r<b) ans.d[i]=0;
    else{
      ans.d[i]= r/b;
      r = r % b;
    }
  }
  while(ans.len-1>=1 && ans.d[ans.len-1]==0){
    ans.len--;
  }
  return ans;
}


void print(bign ans,int &r){
  for(int i = ans.len-1;i>=0;i--){
    printf("%d",ans.d[i]);
  }
  printf(" %d",r);
}
int main(){
  char a[1005];
  int b;
  scanf("%s%d",a,&b);
  bign A = change(a);
  bign C = divide(A,b,r);
  print(C,r);
  return 0;
}

 

1019:数字黑洞(20 分)(AC)

注意要点:

1.这个题的思路不是很难,注意sort的写法就行。

#include<iostream>
#include<algorithm>
using namespace std;

int a[5] = { 0 };

bool cmp(int a , int b) {
	return a > b ; 
} //cmp的基础用法//

void isarray(int N ) {
	for(int i = 0 ; i < 4 ; i ++) {
		a[i] = N % 10;
		N /= 10;
	}
}

int isnumber(int A[]) {
	int sum = 0;
	for(int i = 0 ; i < 4 ; i ++) {
		sum = sum * 10 + a[i];
	}
	return sum;
}

int main() {
	int N , min , max;
	scanf("%d" , &N);
	while(1) { //这个循环的条件要注意//
		isarray(N);
		sort(a , a + 4);
		min = isnumber(a);//最小值// 
		sort(a , a + 4 , cmp);
		max = isnumber(a); //最大值//
	        N = max - min ; 
	        printf("%04d - %04d = %04d\n" , max , min , N);
 		if(N == 0 || N == 6174) break; 
    }
    return 0;
}
 

 

1021:个位数统计 (15)   (完成)

#include<iostream>
using namespace std;

int main(){
  char s[10000];
  int a[10]={0},i=0;
  while(scanf("%c",&s[i])==1){
    a[s[i]-'0']++;
    i++;
  }
  for(int i=0;i<=9;i++){
    if(a[i]!=0)
    printf("%d:%d\n",i,a[i]);
  }
  return 0;
}

 

1022:D进制的A+B (20)(20 分)(完成)

注意要点:

1.这个题是典型的进制转换题型,对于P进制转换Q进制,中间加一个10进制作为转换的接口。

2.所谓的除基取余法,其实就是手动模拟除法。

#include<iostream>
using namespace std;
int main(){
  int e,b,c,sum,a[40] ,num = 0;;
  scanf("%d%d%d",&e,&b,&c);
  sum = e + b ;
  do{
    a[num++] = sum % c ;
    sum /= c ;
  } while(sum != 0);
  
  for(int i=num-1;i>=0;i--){
    printf("%d",a[i]);
  }
  return 0;
}

 

1023:组个最小数 (20)(20 分)(完成)

注意要点:

1.有思路->按照思路写代码。

#include<iostream>
using namespace std;
int a[10]={0};
int main(){
  for(int i=0;i<10;i++){
    scanf("%d",&a[i]);
  }
  for(int i=1;i<10;i++){
    if(a[i]!=0){
    printf("%d",i),a[i]-=1;
    break;
    }
  }
  for(int i=0;i<10;i++){
    if(a[i]!=0){
      for(int j=0;j<a[i];j++){
        printf("%d",i);
      }
    }
  }
  return 0;
}

 

1026:程序运行时间(15) (AC)

注意要点:

1.怎么写四舍五入?只能是手动判断,当这个数值大于100 的一半的时候,我们就能这样做。

#include<iostream>
using namespace std;

int main(){
	int a , b , c;
	scanf("%d%d" , &a , &b);
	int m = b - a ; 
	if(m %100 >= 50)    //手动四舍五入//
		c = (b - a) / 100 + 1;
  	else	c = (b - a) / 100;
  printf("%02d:%02d:%02d" , c / 3600 , (c % 3600) / 60 , c % 60);
  return 0;
}

 

1029:旧键盘(20)(20 分)(AC)

注意要点:

1.第一次接触到Hash思想,以后可以多注意。

2.注意分析问题的时候,在脑子里面自己要考虑清楚会发生什么样子的情况。

3.Hash + 动态更新。

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char a[85],c[85];
	int b[100000] = { 0 };
	scanf("%s" , a);
	int len1 = strlen(a);
	for(int  i = 0 ; i < len1 ; i ++) {
		if(a[i] >= 'a' && a[i] <= 'z') {
			a[i] = a[i] - 32 ;
			b[a[i] - '0'] = 1;
		}
		else	b[a[i]-'0'] = 1 ;
	}
	getchar();
	scanf("%s" , c);
	int len2 = strlen(c); 
	for(int i = 0 ; i < len2 ; i ++) { 
		if(c[i] >= 'a' && c[i] <= 'z') {
			c[i] = c[i] - 32 ;
			b[c[i] - '0']= 2;
		}
		else	b[c[i]-'0'] = 2 ;
	}
	for(int  i = 0; i < len1 ; i ++) {
		if(b[a[i]-'0'] == 1) {
			printf("%c" , a[i]);
			b[a[i]-'0'] = 0;
		}
	}
	return 0;
}

 

1031:查验身份证(15)(AC)

注意要点:

1.再次说明思路的问题。做题之前必须有一个合理的思路,这样可以提高很大的正确率。

2.注意你每一行的写法,一个小的错误都会是致命的。

3.全对输出这个怎么做?直接设置一个flag放进去等就行了。前提是flag不是一个判断条件。

4.非数字的写法判断。

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int N;
	scanf("%d" , &N);
	char s[19];
	char M[15] = {'1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5'  , '4' , '3' , '2'};
	int w[20] = {7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2}; 
	bool flag = true; 
	for(int i = 0 ; i < N ; i ++) {
		int sum = 0;
		scanf("%s" , s);
		getchar();
		int j;
		for( j = 0 ; j < 17 ; j ++) {
			if(! (s[j] >= '0' && s[j] <= '9'))//看好这个非数字的写法// 
				break;
			sum += (s[j] -'0') * w[j];
		}
		//当不够的时候,说明里面有字母// 
		if(j < 17) {
			flag = false;
			printf("%s\n" , s); 
		}
		//验证不对,输出// 
		else {
			if(M[sum % 11] != s[17]){
				flag = false;
				printf("%s\n" , s);
			}
		}
	}
	//如果全对的时候,设置一个外变量,看其是否变化.// 
	if(flag == true){
		printf("All passed");
	}
	return 0;
}

 

1032:挖掘机技术哪家强(20)(20 分)(完成)

注意要点:

1.输入。

#include<iostream>
using namespace std;
int main(){
  int a[100005]={0};
  int n,max=0,k,num,score;
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
    //scanf("%d %d",&c,&a[c]);这样写有点问题//
    scanf("%d%d",&num,&score);
    a[num]+=score;
  }
  for(int i=1;i<=n;i++){
    if(max<=a[i]) {
      max = a[i];
      k=i;
    }
  }
  printf("%d %d",k,max);
  return 0;
}

 

1033 :旧键盘打字(20 分)(WA)

还未完成,13分,三个未通过。

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char a[100005] , b[100005];
	int c[300] = { 0 };
	int G = 0;
	scanf("%s" , a);
	int len1 = strlen(a);
	for(int i = 0 ; i < len1 ; i ++) {
		if(a[i] == '+'){
			G = 1;
		}
		c[a[i] - '0'] = 1;
		if(a[i] >= 'A' && a[i] <= 'Z'){
			a[i] = a[i] + 32;
			c[a[i]-'0'] = 1;	
		}
	}
	getchar();
	scanf("%s" , b);
	int len2 = strlen(b);
	for(int i = 0 ; i <len2 ; i++) {
		if(G == 1) {
			if(b[i] >= 'A' && b[i] <= 'Z') {
				c[b[i] - '0'] = 1;
			}
		}
	}
	for(int i = 0 ; i <len2 ; i ++) {
		if(c[b[i] - '0'] == 0)
			printf("%c" , b[i]); 
	}
	return 0;
}

 

1036:跟奥巴马一起编程(15)(15 分)(完成)

注意要点:

1.除(÷)这个符号会直接截取。

#include<iostream>
using namespace std;
int main(){
  int n,b;
  char a;
  scanf("%d %c",&n,&a);
  if(n%2==0)	b=n/2;
  else	b=n/2+1;
  for(int i=1;i<=b;i++){
    for(int j=1;j<=n;j++){
      if(i==1 || i==b || j==1 || j==n)    printf("%c",a);
      else                                    printf(" ");
      if(j==n)		printf("\n");
    }
  }
  return 0;
}

 

1037:在霍格沃茨找零钱(20 分)(AC)

注意要点:

1.认真考虑进制转换的那个地方。

#include<iostream>
using namespace std;

int main() {
	int G1 , S1 , K1 , G2 , S2 , K2;
	scanf("%d.%d.%d %d.%d.%d" , &G1 , &S1 , &K1 , &G2 , &S2 , &K2);
	int P  = 17 * 29 * G1 + 29 * S1 + K1;
	int A  = 17 * 29 * G2 + 29 * S2 + K2;	 	
	if(P <= A) {
		printf("%d.%d.%d" , (A - P) / (29 * 17) , ((A - P) % (29 * 17)) / 29 , (A - P) % (29 * 17) % 29 );
	}
	else	printf("-%d.%d.%d" , (P - A) / (29 * 17) , ((P - A) % (29 * 17)) / 29 , (P - A) % (29 * 17) % 29 );
	return 0;
} 	

 

1038:统计同成绩学生(20)(20 分)(AC)

注意要点:

1.行末不得有空格的写法。

#include<iostream>
using namespace std;

int main() {
	int grade[105] = { 0 };
	int find[100005] = { 0 };
	int N , a , n , b; 
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a);
		grade[a] ++;
	}
	scanf("%d" , &n);
	for(int i = 0 ; i < n ; i++) {
		scanf("%d" , &find[i]);
	} 
	for(int i = 0 ; i < n ; i++) {
		if(i == n - 1) {	printf("%d" , grade[find[i]]);	break;}
		printf("%d " , grade[find[i]]);
	} 
	return 0;
} 	

 

1039:到底买不买(20)(AC)

注意要点:

1.转换HashTable下标这个地方需要注意。搞清楚问什么它会这么做,不只是将这个变成ASCII码数值。

2.这个地方只是让求 miss 个数,所以没有必要去搞什么循环。

#include<iostream>
#include<cstring>
using namespace std;

int change(char a) {
	if(a >= '0' && a <= '9')	return a - '0';
	if(a >= 'a' && a <= 'z')	return a - 'a' + 10;
	if(a >= 'A' && a <= 'Z')	return a -'A' + 36;	
}

int main() {
	int miss = 0 ;
	int HashTable[200] ={0}; 
	char s1[1005] , s2[1005];
	int sum = 0 ;
	scanf("%s" , s1);
	int len = strlen(s1);
	for(int i = 0 ; i < len ; i ++) {
		HashTable[change(s1[i])] ++; 
	}
	getchar();
	scanf("%s" , s2);
	int len2 = strlen(s2);
	for(int i = 0 ; i < len2 ; i ++) {
		HashTable[change(s2[i])] --;
		if(	HashTable[change(s2[i])] < 0)
			miss ++;	
	}
	
	if(miss > 0) //第一串中没有第二串的材料//
		printf("No %d" , miss);
	 
	else 
		printf("Yes %d" , len - len2);
	return 0;
} 

 

1040:有几个PAT(25)(AC)

注意要点:

1.这个题的思路很巧妙。利用PAT三个数之间的关系来解决问题。

2.可以看一看为什么需要取余1000000007

#include<iostream>
#include<cstring>
using namespace std;
int main(){
  char s[100005];
  scanf("%s",s);
  int len = strlen(s),t=0,p=0,sum=0;
  for(int i=0;i<len;i++){
    if(s[i]=='T'){
      t++;
    }
  }
  for(int i=0;i<len;i++){
    if(s[i]=='T') t--;
    if(s[i]=='P') p++;
    if(s[i]=='A') sum=(sum+(t*p)%1000000007)%1000000007;//有点问题。//
  }
  printf("%d",sum);
  return 0;
}

 

1041:考试座位号(15 分)(AC)

注意要点:

1.结构体问题。怪不得上次天梯赛的那个题目会是那个样子,原来如此。using namespace std 会出现撞车的情况报错,显示已经定义过。redeclared as different kind of symbol。

#include<iostream>
using namespace std;//撞车//

struct Std{
	char s[20];
	int a ;
	int b ;
}sd[1005];//这个地方写成会与上面撞车。//

int main() {
	int N , M;
	int P[1005] = {0};
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%s %d %d" , sd[i].s , &sd[i].a , &sd[i].b);
	} 
	getchar();
	scanf("%d" , &M);
	for(int  i = 0 ; i < M ; i ++) {
		scanf("%d" , &P[i]);
	}
	for(int i = 0 ; i < M ; i ++) {
		for(int j = 0 ; j < N ;j ++) {
			if(P[i] == sd[j].a)
				printf("%s %d\n", sd[j].s , sd[j].b);
		}
	}
	return 0;
}

 

1042:字符统计(20 分)(AC)

注意要点:

1.按照最小的怎么来?去掉等于号就可以了。

#include<iostream>
using namespace std;
int main() {
	char a , d;
	int max = -10000;
	int b[30] = { 0 };
	while(scanf("%c" , &a) == 1) {
		if(a >= 'a' && a <= 'z' ) 
			b[a - 'a'] ++;
		if(a >= 'A' && a <= 'Z')
			b[a - 'A'] ++;
	}
	for(int i = 0 ; i < 27 ; i ++) {
		if(b[i] > max) {
			max = b[i] ;
			d = i;
		}
	}
	printf("%c %d" , d + 'a' , max); 
	return 0;
}

 

1043:输出PATest(20 分)(AC)

注意要点:

1.while scanf写法注意符号“&”的控制。

2.这个输出的思路很精妙。

3.平行Hash技巧。可以省去很多的麻烦。

#include<iostream>
using namespace std;
int main() {
	char a , b[6] = {'P' , 'A' , 'T' , 'e' , 's' , 't'};
	int c[6] = { 0 };
	int sum = 0;
	while(scanf("%c" , &a) == 1) {
		for(int  i = 0 ; i < 6 ; i ++) {
			if(a == b[i]) {
				c[i] ++;
				sum ++;
			} 
		}
	}
	while(sum > 0) {
		for(int i = 0 ; i < 6 ; i ++) {
			if(c[i] > 0) {
				printf("%c" , b[i]);
				c[i] --;
				sum --;
			}
		}
	}
	return 0;
}

 

1045:Quick Sort(25 分)(AC)

注意要点:

1.思路很清晰,但是这个地方可以利用这个小技巧,因为你每次前面的数据就是这个这个最小值了,所以完全没有必要每次都去遍历前面的数据,直接可以与上一个数据进行比较就行。

2.本题目和QS完全没有任何关系,倒像是在给你介绍QS的原理。

2.这个地方注意有个坑,最后需要输出一个回车。我其实很费解这个东西。以后建议所有的题目之后都去写一个回车以防万一。

#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 1000000000;
int main() {
	int N , sum = 0;
	int a[100005] = {0};
	int leftmax[100005] = {0};
	int rightmin[100005] = {0};
	
	//input// 
	scanf("%d" , &N);
	leftmax[0] = 0;
	rightmin[N - 1] = INF;
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a[i]);
	}
	//leftmax:可修正,其实完全不必每次都把数据遍历一次//
	for(int i = 1 ; i < N ; i ++) {
		leftmax[i] = max(leftmax[i - 1] , a[i - 1]);
	}
	//rightmin,这个地方你想,如果要是N - 1 的话,N - 1 + 1 不就翻出数组外头去了。。//
	for(int i = N - 2; i >= 0 ; i --) {
		rightmin[i] = min(rightmin[i + 1] , a[i + 1]);
	}
	//statistic// 
	for(int i = 0 ; i < N ; i ++) {
		if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
			sum ++;
		}
	}
	//output//
	printf("%d\n" , sum);
	for(int i = 0 ; i < N ; i ++) {
		if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
	    	printf("%d" , a[i]);
	    	sum--;
	    	if(sum != 0) printf(" ");
		}
	}
	printf("\n");//无厘头的要求。// 
	return 0;
} 

1046:划拳(15 分)(AC)

水题没啥说的。

#include<iostream>
using namespace std;

int main(){
	int N , x = 0, y = 0;
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		int s[4] = {0};
		for(int j = 0 ; j < 4 ; j ++ ) {
			scanf("%d" , &s[j]);
		}
		//如果两个人都赢了,或者都输了 ,下一轮// 
		if(s[0] + s[2] == s[1] && s[0] + s[2] == s[3]) continue;
		if(s[0] + s[2] != s[1] && s[0] + s[2] != s[3]) continue; 
		//甲赢了 乙喝酒// 
		if(s[0] + s[2] == s[1])	x ++;
		//乙赢了 甲喝酒// 
		if(s[0] + s[2] == s[3])	y ++;
	}
	printf("%d %d" , y , x);
	return 0;
}

 

1047:编程团体赛(20 分)

注意要点:

1.注意题目给的范围,在此基础之上增加一点即可,但是注意一定要大。(+ 5即可。)

#include<iostream>
using namespace std;
int main() {
	int N;
	int grade[1005] = { 0 };//注意范围大小//
	int max1 = -10000 , max2 = -1000;
	int x , y, z;
	scanf("%d" , &N);
	while(N --) {
		scanf("%d-%d %d" , &x , &y , &z);
		grade[x] += z ;
		if(grade[x] > max1) {
			max1 = grade[x];
			max2 = x; 
		} 
	}
	printf("%d %d" , max2 , max1);
	return 0;
}

 

1052:卖个萌(20 分)(AC)(01:21:33)

注意要点:

1.AC了两次老是报错,后来才发现是根本写不出来这几个字符。

2.更加高级一点的 string 用法。加深了一遍印象。

3.注意出现的转义字符的用法。

#include<iostream>
#include<cstring> 
using namespace std;

int get(string a , string b[]) {
	int k = 0 ;
	for(int i = 0 ; i < a.size() ; i ++) {
		if(a[i] != '[' && a[i] != ']' && a[i] != ' ') {
			b[k] += a[i];//这一步是为什么?// 
		}
		if(a[i] == ']')
			k ++;
	}
	return k;
}

string s[3];//这个地方是三个string.// 
string shou[15] , yan[15] , kou[15];
int main() {
	for(int i = 0 ; i < 3 ; i ++) {
		getline(cin , s[i]);
	}
	int len1 = get(s[0] , shou);
	int len2 = get(s[1] , yan);
	int len3 = get(s[2] , kou);
	
	int N ; 
	scanf("%d" , &N);
	
	for(int i = 0 ; i < N ; i ++) {
		int face [5] = { 0 };
		for(int j = 0 ; j < 5 ; j ++) {
			cin >> face[j] ; 
		}
		if(face[0]> len1 || face[1] >len2 || face[2] > len3 || face[3] > len2 || face[4] > len1 || face[0] <= 0 || face[1] <= 0 || face[2] <= 0 || face[3] <= 0 || face[4] <= 0) {
			cout << "Are you kidding me? @\\/@" << endl;//这个地方的转义字符// 
		}
		else {
			cout << shou[face[0] - 1] << "(" << yan[face[1] - 1] << kou[face[2] - 1] << yan[face[3] - 1] << ")" << shou[face[4] - 1] << endl;
		}
	}
	return 0;
} 

 

1056:组合数的和(15 分)(AC)

注意要点:

无。

#include<iostream>
using namespace std;
int main() {
	int N;
	int sum = 0;
	int a[15] = { 0 };
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a[i]);
	}
	for(int i = 0 ; i < N ; i ++) {
		for(int j = 0 ; j < N ; j ++) {
			if(i != j) sum += a[i]*10 + a[j];
		}
	}
	
	printf("%d" , sum);
	return 0;
} 

 

1057:数零壹(20 分)(AC)

注意要点:

1.注意那个判断二进制的问题。do while 不行的原因就是它会先做,所以需要用while。

#include<iostream>
#include<cstring>
using namespace std;

int m = 0 , n = 0;

int main() {
	int sum = 0; 
	char a;
	while(scanf("%c" , &a) == 1){
			if(a >= 'A' && a <= 'Z') {
			  sum += (a - 'A' + 1) ;
			}
			if(a >= 'a' && a <= 'z'){
			  sum += (a - 'a' + 1);
		  }
	} 
	
	while(sum != 0) {
		if(sum % 2 == 0) m ++;
		else	n ++;
		sum = sum / 2;
	}
	
	printf("%d %d" , m , n);
	return 0;
} 

 

1059:C语言竞赛(20 分)(AC)

注意要点:

1.送巧克力的记得也别再要了。

#include<iostream>
using namespace std;

int isprime(int i) {
	if(i <= 0) return false;
	for(int j = 2 ; j * j <= i ; j ++){
		if(i % j == 0) return false;
	}
	return true;
}
 
int main() {
	int M , N , d;
	int name[10005] = {0};
	int judge[10005] = {0}; 
	scanf("%d" , &M);
	for(int i = 1 ; i <= M ; i ++) {
		scanf("%d" , &name[i]);
		judge[name[i]] = i;
	}
	scanf("%d" , &N);
	for(int i = 1 ; i <= N ; i ++) {
		scanf("%d" , &d);
		if(judge[d] == 1){
			printf("%04d: Mystery Award\n" , d);
	    	judge[d] = -1;
		}//神秘大奖// 
		else if(isprime(judge[d]) == 1) {
			printf("%04d: Minion\n" , d);
			judge[d] = -1;
		}//小黄人//
		else if(judge[d] == -1){
			printf("%04d: Checked\n" , d); 
		} //已经领过// 
		else if(judge[d] == 0) {
			printf("%04d: Are you kidding?\n" , d);
		}//没参与// 
		else {printf("%04d: Chocolate\n" , d);//巧克力// 	
				judge[d] = -1;                   //#少加一个判断//
		}
    }
	return 0;
} 

 

1060:爱丁顿数(25 分)(AC)

注意要点:

1.sort 的用法出现了,cmp1。

#include<iostream>
#include<algorithm>
using namespace std;

bool cmp1(int a , int b) {
	return a > b;
}

int main() {
	int N , i;
	int a[100000] ;
	scanf("%d" , &N);
	for(int i = 1 ; i <= N ; i ++) {
		scanf("%d" , &a[i]);
	} 
	sort(a + 1 , a + N + 1, cmp1);
	i = 1;
	int count =0 ;
	while( i <= N && a[i] > i) {
		i++;
		count++;
	}
	printf("%d" , count);
	return 0;
}

 

1061:判断题(15 分)

注意要点:一行写完之后,不能有语法错误。快准狠。

#include<iostream>
using namespace std;
int main() {
	int M , N;
	int c , sum = 0;
	int a[100] = { 0 };
	int b[100] = { 0 };
	scanf("%d %d" , &M , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &a[i]);
	}
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d" , &b[i]);
	} 
	for(int i = 0 ; i < M ; i ++) {
		for(int j = 0 ; j < N ; j ++) {
			scanf("%d" , &c);
			if(c == b[j]) {
				sum += a[j];
			}
		}
		printf("%d\n" , sum);
		sum = 0;
	} 
	return 0;
} 

 

1062:最简分数(20 分)

注意要点:

1.辗转相除法的使用。

2.强调思路的重要性。先写主函数,主函数框架思路搭好,补充其他函数就行。

3.题目,每个题目每句话必有用。两个数字大小还能不一样,真的服了。

#include<iostream>
using namespace std;

int gcd(int a , int b) {
	if(b == 0) return a;
	else gcd(b , a % b);
}

int lcm (int b , int d , int e) {
	int f , h;
	f = gcd(b , d);
	f = b / f * d;
	h = gcd(f , e);
	h = f / h * e;	
	return h; 
}
int main() {
	//先找最小公倍数//
	int a , b , c , d , e;
	int count = 0;
	int g[1005] = {0} ;
	scanf("%d/%d %d/%d %d" , &a , &b , &c , &d , &e);
	int f = lcm(b , d , e);
	// 变换分子//
	a = f / b * a ;
	c = f / d * c ;
	
	//踩坑点:有可能两个正分数大小不等//
	if(a > c){
		int temp = a; a = c; c = temp;
		temp = b; b = d; d = temp; 
	} 
	//分子分母变换,余数不为 0 则输出// 
	for(int i = a + 1 ; i < c ; i ++) {
		if(f % e == 0){
			if(i % (f / e) == 0 && gcd(i / (f / e) , e) == 1) {
				g[count ++] = i / (f / e);
			}
    	}
	}
	for(int i = 0 ; i < count ; i ++) {
		if(i == count - 1) {
			printf("%d/%d" , g[i] , e);
			break;
		}
		printf("%d/%d " , g[i] , e);
	}
	return 0;
}

 

1063:计算谱半径(20 分)(AC)

注意要点:

1.注意开方函数 sqrt, 没了。

2.此题有一个疑点尚未解决,那就是四舍五入的问题。

#include<iostream>
#include<math.h>
using namespace std;

double fun(int a , int b) {
	return sqrt(a * a + b * b);//注意四舍五入和开方用法// 
}
int main() {
	int N , a , b;
	double max = -1000.0;
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%d%d" , &a , &b);
		if(fun(a , b) > max) {
			max = fun(a , b);
		}
	}
	printf("%.2f" , max); 
	return 0;
} 

 

1064:朋友数(20 分)(AC)

注意要点

1.注意看输出的内容。

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int N , sum = 0 , count = 0;
	int d[100] = { 0 };
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		char a[1005];
		scanf("%s" , a); 
		int len = strlen(a);
		for(int j = 0 ; j < len ; j ++) {
			sum += (a[j] - '0');
		}
		d[sum] = 1 ;
		
		sum = 0; 
		 
	}
	for(int i = 0 ; i < 99 ; i ++) {
		if(d[i] == 1) count ++;
	}
	printf("%d\n" , count);
	for(int i = 0 ; i < 99 ; i ++) {
		if(d[i] == 1) {
			printf("%d" , i );
			count--;
			if(count != 0)
				printf(" ");
		}
	}
	return 0; 
}

 

1065:单身狗(25 分)(AC)

注意要点:

1.呵呵,这个题目真的侥幸,没有让输出 00000,要不然拿不了满分。

2.注意补齐0的写法:在输出的前面写上,%05d。0代表占位格,5代表个数。

#include<iostream>
using namespace std;
int main() {
	int N , d , e ,count = 0;
	int a[100005] = { 0 }, c[100005] = { 0 };
	//输入//
    scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%05d%05d" , &d , &e);
		a[d] = 1;
		a[e] = 1;
		c[d] = e;
		c[e] = d;
	}
	scanf("%d" , &N);
	for(int i = 0 ; i < N ; i ++) {
		scanf("%05d" , &d);
		a[d] = 2;
	}
    //数数值//
	for(int i = 0 ; i < 100005 ; i ++) {
		if(a[i] == 2)	count ++;
	}
    //判断条件是否成立//
	for(int i = 0 ; i < 100005 ; i ++) {
		if(a[i] == 2 && a[c[i]] == 2) {
			a[i] = 1;
			a[c[i]] = 1;
			count -= 2;
		}	
	}
    //输出//
	printf("%d\n" , count);
	for(int i = 0 ; i < 100005 ; i ++) {
		if(a[i] == 2) {
			printf("%05d" , i);
			count -- ;
			if(count != 0) printf(" "); 
		}
	}
	return 0;
}

 

1066:图像过滤(15 分)(AC)

注意要点:

1.注意数组开辟的时候的定义。

#include<iostream>
using namespace std;
int main() {
	int M , N , A , B , h;
	int d[505][505] = { 0 };//注意//
	scanf("%d%d%d%d%d" , &M , &N , &A , &B , &h);
	for(int i = 0 ; i < M ; i ++) {
		for(int j = 0 ; j < N ; j ++) {
			scanf("%d" , &d[i][j]);
			if(A <= d[i][j] && d[i][j] <= B) {
				d[i][j] = h;
			}
		}
	}
	for(int i = 0 ; i < M ; i ++) {
		for(int j = 0 ; j < N ; j ++) {
			if(j == N - 1)
				printf("%03d\n" , d[i][j]);
			else
				printf("%03d " , d[i][j]);
		}
	} 
	return 0;
} 

 

1067:试密码(20 分)(AC)

注意要点:

1.首次使用getline放在循环里使用。getline现在还不会对string类进行操作,会了的话可以代替 %s 了。

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	string a , b;
	int N , c = 0 , sum = 0;
	cin >>a>>N;  
	getchar();
	while(getline(cin , b)) {
		if(b == "#")	break;
		if(a != b && c != 1){
			cout<<"Wrong password: "<<b<<endl;
			sum ++;	
		}
		else c = 1;	
	    	
	}
	if(sum == N){
		printf("Account locked\n");
	}
	if(c == 1 && sum != N) {
		printf("Welcome in\n");
	}
	return 0;
} 


1076:Wifi密码(15 分)(AC)

注意要点:

1.map的头文件是 #include <map> ,仅仅只是演示了一下map 的用法。其实就是映射(数组),没有什么。

#include<iostream>
#include<map>
using namespace std;
int main(){
	map<char , int>a;
	a['A'] = 1;
	a['B'] = 2;
	a['C'] = 3;
	a['D'] = 4;
	int N;
	char c , b;
	int print[105] = { 0 };
	scanf("%d",&N);
	getchar();
	for(int i = 1; i <= N; i ++) {
		for(int j = 1; j <= 4; j ++) {
			scanf( "%c-%c" , &c , &b);
			getchar();
			if( b == 'T')
				print[i] = a[c];
		}
	}
	for( int i = 1;i <= N ; i++) {
		printf( "%d" , print[i]);
	}
	return 0;
} 

 

1078:字符串压缩与解压(20 分)(AC)

注意要点:

1.getline。getline有点类似于gets,作用于string之上。晚上补一个博客链接。getline()

2.这个题目分成两种形态做比较舒服。各管各的,不需要多操心。

#include<iostream>
#include<cstring>
using namespace std;

string a;

void fun1(){
	getline(cin,a);
	for(int i = 0; i <a.length() ; i ++){
		int num = 0;
		while(a[i]==a[i+1]){
			i++;
			num++;
		}
		if(num != 0){
			printf("%d" , num+1);
		}
		printf("%c" , a[i]);
	}
}

void fun2(){
	getline(cin , a) ;
	for(int i=0 ; i < a.length() ; i ++){
		int sum = 0 ;
		while( a[i] >= '0' && a[i] <= '9'){
			sum = sum * 10 + (a[i ++] - '0') ;
		}
		for(int j = 0 ; j < sum ; j++){
			printf("%c" , a[i]) ; 
		} 
		if(sum == 0){
			printf("%c" , a[i]);
		} 
	}
}

int main(){
	char N;
	scanf("%c" , &N);
	getchar();
	if(N=='C')	fun1();
	else    	fun2();
	printf("\n");
	return 0;
} 

 

1081:检查密码(15 分)(已完成)

注意要点:

1.小心为空,这次之后%s可能会换成getline了。

2.如何查找一个字符串中是否没有一个东西?答:设置一个标记。定义的时候记得放在循环里面。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int N;
	int m1 = 0,m2 = 0,m4 = 0;
	string a;
	scanf("%d", &N);
	getchar();
	while(N --) {
		int m1 = 0,m2 = 0,m4 = 0;
		getline(cin,a);
		int s = a.length();
		//密码太短 
		if(s < 6) {
			printf("Your password is tai duan le.\n");
			continue;
		} 
		for(int i = 0; i < s; i ++){
			if(a[i] >= '0'&& a[i] <= '9')	m1 = 1; 
			else if(a[i] >= 'a' && a[i] <='z')	m2 = 1;
			else if(a[i] >= 'A' && a[i] <='Z')	m2 = 1;
			else if(a[i] == '.')	; 
			else m4 = 1;
		} 
		if(m2 == 0)	{
			printf("Your password needs zi mu.\n");
			continue;
		}
		if(m1 == 0)	{
			printf("Your password needs shu zi.\n");
			continue;
		}
		if(m4 == 1)	{
			printf("Your password is tai luan le.\n");
			continue;
		}
		//密码合法 
		printf("Your password is wan mei.\n");
	} 
	return 0;
}

 

1082:射击比赛(20 分)(已完成)

注意要点:

1.复习结构体。上次踩过的坑不要再踩一次。

2.string 和 char 字符串不是一个概念,不能混用,且string.h下的函数也不能使用。

3.复习结构体的strcpy函数。

#include<iostream>
#include<cstring>
using namespace std;

struct per{
	char id[1005];
	int x;
	int y;
}P;

int main() {
	int N;
	char idmax[1000],idmin[1005];
	scanf("%d" , &N);
	int max = -10000 , min = 10000;
	while(N --) {
		scanf("%s" , P.id); 
		getchar();
		scanf("%d%d" , &P.x , &P.y);
		if(P.x * P.x + P.y * P.y >= max) {
			max = P.x * P.x + P.y * P.y;
			strcpy(idmax , P.id); 
		}
		if(P.x * P.x + P.y * P.y <= min) {
			min = P.x * P.x + P.y * P.y;
			strcpy(idmin , P.id); 
		}
	}
	printf("%s %s" , idmin , idmax);
	return 0;  
}

 

1083:是否存在相等的差(20 分)(已完成,需要补充函数)

注意要点:

1.小心0的情况。这些特殊的观察点一定要注意到,否则不容易想出。

2.针对函数可以在优化,我是不太了解algorithm下的函数变化,随后补充函数abs等等。

#include<iostream>
using namespace std;

int absa(int a, int b) {
	if(a >= b)	return a - b ;
	else	return b - a ;
}

int main() {
	int N , n;
	int count[10005] = { 0 }; 
	scanf("%d" , &N);
	for(int i = 1; i <= N ; i ++) {
		scanf("%d" , &n);
		 count[absa(n , i)] ++;
	}
	for(int i = N ; i >= 0 ; i --){
		if(count[i] != 0 && count [i] >= 2) {
			printf("%d %d\n" , i , count[i]);
		}
	}
	return 0;
} 

 

1091:N-自守数 (15 分)(AC)

这次之后,感觉风格更偏向函数化编程了。

#include<iostream>
#include<vector>
using namespace std;

int sum_s(int a){
	int s = 0;
	while(a > 0){
		s ++;
		a /= 10;
	}
	return s;
}

bool ans(int a , int j){
	vector<int> v;
	int answer = j * a * a;
	while(answer > 0){
		v.push_back(answer % 10);
		answer /= 10;	
	}
	int s = sum_s(a);
	if(s == 1 && v[0] == a){
		return true;
	}
	else if(v[1] * 10 + v[0] == a && s == 2){
		return true;
	}
	else if(s == 3 && v[2] * 100 + v[1] * 10 + v[0] == a){
		return true;
	}
	else if(s == 4 && v[3] * 1000 + v[2] * 100 + v[1] * 10 + v[0] == a){
		return true;
	}
	else{
		return false;
	}	
}

int main(){
	int M , num[25];
	scanf("%d" , &M);
	for(int i = 0 ; i < M ; i ++){
		scanf("%d" , &num[i]);
	}
	for(int i = 0 ; i < M ; i ++){
		bool flag = false;
		for(int j = 1 ; j < 10 ; j ++){
			if(ans(num[i] , j) == true){
				printf("%d %d\n" , j , j * num[i] * num[i]);
				flag = true;
				break;
			}
		}
		if(flag == false){
			printf("No\n");
		}
	}
	return 0;
}

 

1093 字符串A+B (20 分)

注意要点:

1.对于string类型的可以直接使用循环,而且用法类似于char类型,除了不能使用printf()以外。

#include<iostream>
#include<string.h>
using namespace std;

bool judge[150] = {false};

void print(string a){
	for(int i = 0 ; i < a.length() ; i ++){
		if(judge[a[i] - '0'] == false){
			cout << a[i];
			judge[a[i] - '0'] = true;
		}
	}
}

int main(){
	string a , b;
	getline(cin , a);
	getline(cin , b);
	print(a);
	print(b);
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值