PAT (Basic Level) Practice (中文)持续更新ing

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

基础题

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
int main()
{
	int n;
	int num;
	scanf("%d",&n);
	for (num = 0; n != 1; )
	{
		if (n % 2 == 0)
		{
			n = n / 2;
			num++;
		}
		else
			n = n * 3 + 1;
	}
	printf("%d",num);
	return 0;
}

1002 写出这个数 (20 分)
基础题,注意二维字符数组的定义

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int main()
{
	char a[110];//因为最多有10的100次方
	scanf("%s",a);
	int sum=0;
	int len = 0;
	int i;
	char b[11][10] = { {"ling"},{"yi" }, { "er" }, { "san" }, { "si" }, { "wu" }, { "liu" }, { "qi" }, { "ba" }, { "jiu" }, { "shi" } };
	for (i=0; i < strlen(a); i++)
	{
		sum += a[i]-'0';
	}
	while (sum != 0)
	{
		a[len++] = sum % 10;
		sum /= 10;
	}
	for (i = len - 1; i >= 0; i--)
	{
		printf("%s",b[a[i]]);
		if (i != 0)
			printf(" ");
	}
	return 0;
}

1003 我要通过! (20 分)

这题考的是逻辑,设置一个flag,每次输入字符串时flag的初始值设置为1,当检测到字符串不符合要求时,就让flag=0;
最后查看flag的值,根据是1是0决定输出YES或者NO。
符和条件的字符串特征如下:
第一种情况,只有PAT,第二种情况[left个]AP[numA]个AT[right个]A,需要满足right/left=numA,并且numA不为0.

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{    
    int n;
    int i,j;
    char a[110];
    int numA; int left, right;
    int len;
    int flag;
    scanf("%d",&n);
    for (i = 0; i < n; i++)
    {
        numA = 0;
        scanf("%s",a);
        len = strlen(a);
        left = right = 0;
        flag = 1;
        j = 0;
                if (a[0] == 'P')
                {
                    if (a[len - 1] != 'T'||a[j+1]!='A')
                        flag = 0;
                    else
                        for (j++; j < len - 1; j++)
                            if (a[j] != 'A')
                                flag = 0;
                    
                }
                else if (a[0] == 'A')
                {
                    //计算左边的A的个数
                    for (; a[j] == 'A'; j++)
                    {
                        left++;
                    }
                    //printf("1left=%d numA=%d right=%d\n", left, numA, right);
                    if (a[j] == 'P')
                    {
                        j++;
                        for (; a[j] == 'A'; j++)
                        {
                            numA++;
                        }
                        if (a[j] == 'T')
                        {
                            j++;
                            for (; a[j] == 'A'; j++)
                            {
                                right++;
                            }
                            //printf("left=%d numA=%d right=%d\n",left,numA,right);
                            if (numA == 0)
                                flag = 0;
                            else if(right / left != numA)
                                flag = 0;
                        }
                        else
                            flag = 0;
                    }
                    else
                    {
                        flag = 0;
                    }
                }
                else
                {
                    flag = 0;
                }
       
        if (flag == 0)
            printf("NO\n");
        else
            printf("YES\n");
    }
    
    return 0;
}

1004 成绩排名 (20 分)
基础结构体+排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//这题可以使用优先队列,或者直接用sort排序
struct student {
    char name[15];
    char id[15];
    int score;
}stu[1010];
bool cmp(student a,student b){
    return a.score < b.score;
}
int main()
{    
    int n;
    int i;
    scanf("%d",&n);
    for (i = 0; i < n; i++)
    {
        scanf("%s %s %d",stu[i].name,stu[i].id,&stu[i].score);
    }
    sort(stu, stu + n, cmp);
    printf("%s %s\n", stu[n-1].name, stu[n-1].id);
    printf("%s %s",stu[0].name,stu[0].id);
    return 0;
}

1005 继续(3n+1)猜想 (25 分)
这题设置一个hashtable,如果数据在之前的序列里没有出现过,就把对应的table表设置为0,反之,设置为1。
输入一个数字num[i]后首先判断table表,如果是1,不用计算了因为之前都出现过,如果为0说明前面没有出现过,把之后每一步计算的结果都标为1,最后留下的hashtable中标为0的数就是关键数。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int hashtable[110] = { 0 };
int cmp(int temp,int num[],int K)
{
    for (int i = 0; i < K; i++)
        if (temp == num[i])
            return num[i];
    return 0;
}
int main()
{    
    int K, i;
    int num[110];//存储每轮输入的数字 
    int temp;
    int ans[110];
    int j=0;
    int flag;
    scanf("%d",&K);
    for (i = 0; i < K; i++)
    {
        scanf("%d", &num[i]);
    }
    for (i = 0; i < K; i++)
    {
       
        if (hashtable[num[i]] == 1)
            continue;
        temp = num[i];
        while(temp!=1)
        {
            
            if (temp & 1)
                temp = (3 * temp + 1) / 2;
            else
                temp /= 2;
           
            flag = cmp(temp, num, K);
            if (flag)//如果序列包含了前面的某个数,那么前面某个数的flag变为1;
            {
                hashtable[flag] = 1;               
               
            }
        }
        
    }
   j = 0;
    for (i = 0; i < K; i++)
    {
        if (hashtable[num[i]] == 0)
            ans[j++] = num[i];
    }
    sort(ans, ans + j);
    for (j--; j >= 0; j--)
    {
        printf("%d",ans[j]);
        if (j != 0)
            printf(" ");
    }
    return 0;
}

1006 换个格式输出整数 (15 分
基础题

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{    
    int n;
    int i;//循环变量
    int temp;
    scanf("%d",&n);
    temp = n / 100;
    for (i = 0; i < temp; i++)
        printf("B");
    temp = (n - n / 100 * 100) / 10;
    for (i = 0; i < temp; i++)
        printf("S");
    temp = n % 10;
    for (i = 1; i <= temp; i++)
        printf("%d",i);
    return 0;
}

1007 素数对猜想 (20 分)
素数基础题

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//入门篇-数学问题-素数-使用筛法求素数比较快
const int maxn = 100010;
int prime[maxn], pNum = 0;
int p[maxn] = { 0 };
void Find_Prime()
{
    for (int i = 2; i < maxn; i++)
    {
        if (p[i] == 0)
        {
            prime[pNum++] = i;
            for (int j = i + i; j < maxn; j += i)
                p[j] = 1;
        }
    }
}
int main()
{    
    int N;
    int num = 0;
    scanf("%d",&N);
    Find_Prime();
    for (int j = 0; prime[j + 1] <= N; j++)
    {
        if (prime[j + 1] - prime[j] == 2)
            num++;
    }
    printf("%d",num);
    return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//1.只改变输出元素的顺序
//2.使用数组交换,交换的次数比较多
//3.使用链表reverse求解
int main()
{    
    
    return 0;
}
#include <stdio.h>

void reverse(int a[], int start, int end){
	for(int i=start; i<=(start+end)/2; i++){
		int tmp = a[i];
		a[i] = a[start+end-i];
		a[start+end-i] = tmp;
	}
}

int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	m %= n;
	int a[n];
	for(int i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	reverse(a, 0, n-m-1);
	reverse(a, n-m, n-1);
	reverse(a, 0, n-1);
	printf("%d", a[0]);
	for(int i=1; i<n; i++){
		printf(" %d", a[i]);
	}
	printf("\n");
	return 0;
}

1009 说反话 (20 分)
基础题,二维字符串数组存放每一个单词

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
	char word[80][80];
	int wordnum;
	char words[80];
	wordnum = 0;
	int num = 0;
	while (scanf("%s", words) != EOF)
	{
		strcpy(word[wordnum++], words);
		//printf("%s", word[num++]);
		memset(words, '\0', sizeof(words));
	}
	for (wordnum = wordnum - 1; wordnum >= 0; wordnum--)
	{
		//printf("!!!");
		printf("%s", word[wordnum]);
		if (wordnum != 0)
			printf(" ");
		else printf("\n");
	}
	//memset(a,'\0',sizeof(a));
	//scanf("%d", &N);
		//scanf("%d %d", &L, &M);
	//printf("%d %d\n", L, M);
		//printf("%d\n", num);

	return 0;
}

—08.12——————————————————————
1010 一元多项式求导 (25 分)
注意没有输出的时候是零多项式,要打印出0 0

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	
	int a, b;
	int temp1, temp2;
	int sum=0;
	int flag = 0;
	while (scanf("%d %d", &a, &b) != EOF)
	{			
			temp1 = a * b;
			temp2 = b - 1;
			if (b != 0)
			{
				if (flag == 1)
					printf(" ");
				printf("%d %d", temp1, temp2);	
				flag = 1;
			}	
				
	}
	if (flag == 0)
		printf("0 0");
	
}

1011 A+B 和 C (15 分)
基础题,用longlong存储

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
using namespace std;
int main()
{
    long long int a, b, c;
    int t, i;

    scanf("%d", &t);
    for (i = 1; i <=t; i++)
    {
        scanf("%lld %lld %lld",&a,&b,&c);
        if (a + b > c)
            printf("Case #%d: true\n",i);
        else
            printf("Case #%d: false\n", i);
    }
    return 0;
}

1012 数字分类 (20 分)
基础题,注意格式

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{
	int N;
	int i;
	int A1, A2, A3, A5;
	float A4;
	int B[6];
	int temp;
	int num;
	while (scanf("%d", &N) != EOF)
	{
		for (i = 0; i < N; i++)
		{
			scanf("%d", &a[i]);
		}
		A1 = A2 = A3 = A4 = A5 = 0;
		B[1] = B[2] = B[3] = B[4] = B[5] = 0;
		temp = 1;
		for (i = 0; i < N; i++)
		{
			num = a[i] % 5;
			if (num == 0)
			{

				if (a[i] % 2 == 0)
				{
					B[1] = 1;
					A1 += a[i];
				}

			}
			else if (num == 1)
			{
				B[2] = 1;
				A2 += temp * a[i];
				temp = temp * (-1);
			}
			else if (num == 2)
			{
				B[3] = 1;
				A3++;
			}
			else if (num == 3)
			{
				B[4]++;
				A4 += a[i];
			}
			else
			{
				B[5] = 1;
				if (a[i] > A5)
					A5 = a[i];
			}
			
		}
		for (i = 1; i <= 5; i++)
		{
			if (B[i] == 0)
			{
				if (i != 5)
					printf("N ");
				else
					printf("N");
			}
				
			else if (i == 1)
				printf("%d ", A1);
			else if (i == 2)
				printf("%d ", A2);
			else if (i == 3)
				printf("%d ", A3);
			else if (i == 4)
				printf("%.1f ", A4 / B[4]);

			else
				printf("%d\n", A5);
		}

	}
	return 0;

}

1013 数素数 (20 分)
素数基础题

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1000001;
bool p[maxn] = { 0 };
int prime[maxn], pNum = 0;
void Find_Prime(int n)
{
	for (int i = 2; i < maxn; i++)
	{
		if (p[i] == 0)
		{
			prime[pNum++] = i;
			if (pNum >= n)
				break;
			for (int j = i + i; j < maxn; j += i)
			{
				p[j] = 1;
			}
		}
	}
}

int main()
{
	int m, n;
	int i;
	int count=0;
	scanf("%d %d",&m,&n);
	Find_Prime(n);
	for (i = m; i <= n; i++)
	{
		printf("%d", prime[i-1]);
		count++;
		if (count % 10 != 0 && i < n)
			printf(" ");
		else
			printf("\n");
	}	
	return 0;

}

1014 福尔摩斯的约会 (20 分)
这题细节真多,判断星期只能是字符A-G,判断小时只能是A-N或者数字,判断完星期之后才能判断小时,注意判断条件,以及break怎么用

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{
	char str1[62], str2[62], str3[62], str4[62];
	scanf("%s %s %s %s", str1, str2, str3, str4); 
		int i, j;
		int flag=0;
		int day;
		int HH, MM;
		int len;
		len = min(strlen(str1), strlen(str2));
		for (i = 0; i < len; i++)
		{
			if (flag == 0)
			{
				if (str1[i] >= 'A' && str1[i] <= 'G'&& str1[i] == str2[i])
				{
					if (str1[i] >= 'A' && str1[i] <= 'G')
						day = str1[i] - 'A' + 1;
					flag++;
					i++;
				}
			}
			 if (flag==1&&( str1[i] >= 'A' && str1[i] <= 'N'|| str1[i] >= '0' && str1[i] <= '9')&& str1[i] == str2[i])
			{
				if (str1[i] >= 'A' && str1[i] <= 'N')
					HH = str1[i] - 'A' + 10;
				else
					HH= str1[i] - '0' + 0;				
				break;
			}					
						
		}
		len = min(strlen(str3), strlen(str4));
		for (i = 0; i < len; i++)
		{
			if ((str3[i] >= 'a' && str3[i] <= 'z' || str3[i] >= 'A' && str3[i] <= 'Z') && str3[i] == str4[i])
			{
				MM = i;
				break;
			}
		}
		//这里直接用一个字符数组更方便
		if (day == 1)
			printf("MON");
		else if (day == 2)
			printf("TUE");
		else if (day == 3)
			printf("WED");
		else if (day == 4)
			printf("THU");
		else if (day == 5)
			printf("FRI");
		else if (day == 6)
			printf("SAT");
		else if (day == 7)
			printf("SUN");
		printf(" ");
		printf("%02d:%02d\n",HH,MM);
			return 0;
}

1015 德才论 (25 分)
德胜才也包括德=才,www题目能不能说清楚一点啊!不然2,3,4测试点也不会一直过不了,还有这个cmp函数有点东西,好方便!
看到别人的题解还有一种方法是在结构体里面加上分级class,这样在sort分类的时候直接比较class就可以了

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int maxn = 100010;
struct student {
	int id;
	int de;
	int cai;
	int sum;
	int hh;//表示才德全高
	int h;//表示才分不到线但是德分到线
	int dc;//得分胜过才分
}stu[maxn];
bool cmp(student a, student b)
{
	if (a.hh != b.hh)  return a.hh > b.hh;//第三筛选标准
	else if (a.hh == 1)
	{
		if (a.sum != b.sum) return a.sum > b.sum;
		else if (a.de != b.de) return a.de > b.de;
		else return a.id < b.id;
	}
	else if (a.h != b.h) return a.h > b.h;
	else if (a.h == 1)
	{
		if (a.sum != b.sum) return a.sum > b.sum;
		else if (a.de != b.de) return a.de > b.de;
		else return a.id < b.id;
	}
	else if (a.dc != b.dc)return a.dc > b.dc;
	else if (a.dc == 1)
	{
		if (a.sum != b.sum) return a.sum > b.sum;
		else if (a.de != b.de) return a.de > b.de;
		else return a.id < b.id;
	}
	else
	{
		if (a.sum != b.sum) return a.sum > b.sum;
		else if (a.de != b.de) return a.de > b.de;
		else return a.id < b.id;
	}



}
int main()
{
	int N, L, H;
	int i;
	int id, de, cai;
	int num = 0;
	scanf("%d %d %d", &N, &L, &H);
	for (i = 0; i < N; i++)
	{
		scanf("%d %d %d", &id, &de, &cai);
		if (de >= L && cai >= L)
		{
			stu[num].id = id;
			stu[num].de = de;
			stu[num].cai = cai;
			stu[num].sum = de + cai;
			stu[num].hh = 0;
			stu[num].h = 0;
			stu[num].dc = 0;
			if (de >= H)
			{
				if (cai >= H)
					stu[num].hh = 1;
				else
					stu[num].h = 1;
			}
			if (de >= cai)
			{
				stu[num].dc = 1;
			}
			num++;
		}


	}
	//for (i = 0; i < num; i++)
		//printf("%d %d %d %d %d %d\n", stu[i].id, stu[i].de, stu[i].cai, stu[i].hh, stu[i].h, stu[i].dc);
	sort(stu, stu + num, cmp);
	printf("%d\n", num);
	for (i = 0; i < num; i++)
		printf("%d %d %d\n", stu[i].id, stu[i].de, stu[i].cai);

}

1016 部分A+B (15 分)
基础题

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int main()
{
	int a, da, b, db;
	int pa,pb;
	scanf("%d %d %d %d",&a,&da,&b,&db);
	pa = pb = 0;
	while (a != 0)
	{
		if (da == a % 10)
			pa = pa * 10 + da;
		a /= 10;
	}
	while (b != 0)
	{
		if (db == b % 10)		
			pb = pb * 10 + db;			
		b /= 10;
	}	
	printf("%d\n",pa+pb);

}

1017 A除以B (20 分)
大整数相除
1018 锤子剪刀布 (20 分)
codeup原题

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{	
	int N;
	char temp1, temp2;
	int i;
	int jia[6] = { 0 };
	int yi[6] = {0};
	int max1, max2;
	scanf("%d", &N);
	for (i = 0; i < N; i++)
	{
		getchar();
		scanf("%c %c", &temp1, &temp2);
		if (temp1 == temp2)
		{
			jia[1]++;
			yi[1]++;
		}
		if (((temp1 == 'C') && (temp2 == 'J')))
		{
			jia[0]++;
			yi[2]++;
			jia[4]++;
		}
		if (((temp1 == 'J') && (temp2 == 'B')))
		{
			jia[0]++;
			yi[2]++;
			jia[5]++;
		}
		if (((temp1 == 'B') && (temp2 == 'C')))
		{
			jia[0]++;
			yi[2]++;
			jia[3]++;
		}
		if (((temp2 == 'C') && (temp1 == 'J')))
		{
			jia[2]++;
			yi[0]++;
			yi[4]++;
		}
		if (((temp2 == 'J') && (temp1 == 'B')))
		{
			jia[2]++;
			yi[0]++;
			yi[5]++;
		}
		if (((temp2 == 'B') && (temp1 == 'C')))
		{
			jia[2]++;
			yi[0]++;
			yi[3]++;
		}	
	}
	max1 = max2 = 3;
	for (i = 3; i <= 5; i++)
	{
		if (jia[i] > jia[max1])
			max1 = i ;
		
		if (yi[i] > yi[max2])
			max2 = i;		
	}	
	printf("%d %d %d\n", jia[0], jia[1], jia[2]);
	printf("%d %d %d\n", yi[0], yi[1], yi[2]);
	
	if (max1 == 3)
		printf("B ");
	else if (max1 == 4)
		printf("C ");
	else printf("J ");

	if (max2 == 3)
		printf("B");
	else if (max2 == 4)
		printf("C");
	else printf("J");
    return 0;

}

1019 数字黑洞 (20 分)

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
using namespace std;
bool cmp(int a, int b)
{
	return a > b;
}
int to_number(int a[])
{
	int i;
	int temp = 1; 
	int ans=0;
	for (i = 3; i >=0; i--)
	{
		ans += a[i] * temp;
		temp *= 10;
	}
	return ans;
}
void to_array(int a[],int temp)
{
	int i;
	for (i = 0; i <4; i++)
	{
		a[i] = temp % 10;
		temp /= 10;
	}
	return;
}

int main()
{
	int i;
	
	int a[5];
	int num;
	int num1, num2;
	int temp=0;//当前两个数的差值
	
	scanf("%d", &num);//从输入获取数字
	

	while (1)
	{		
		to_array(a,num);//将数字存储到整数数组a内
		sort(a, a + 4);//从小到大排列
		num1 = to_number(a);//输出到num1中
		sort(a, a + 4, cmp);//
		num2 = to_number(a);
		num = num2 - num1;//计算大数建去小数
		printf("%04d - %04d = %04d\n", num2, num1,num);
		if (num == 0||(num==6174))
			break;		
	}
	return 0;
}

1020 月饼 (25 分)
贪心

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mooncake {
	double store;//库存量
	double sell;//总售价
	double price;//单价
}cake[1010];//最多有1000种月饼
bool cmp(mooncake a, mooncake b)//将月饼结构体按照单价由高到低排序
{
	return a.price > b.price;
}
int main()
{
	double gain=0;//最大收益
	int N, D;
	int i;
	scanf("%d %d", &N, &D);
	for (i = 0; i < N; i++)//接收库存量
	{
		scanf("%lf", &cake[i].store);
	}
	for (i = 0; i < N; i++)//接受总售价
	{
		scanf("%lf", &cake[i].sell);
	}
	for (i = 0; i < N; i++)//计算单价
	{
		cake[i].price = cake[i].sell / cake[i].store;
	}
	sort(cake, cake + N, cmp);//排序
	for (i = 0;i < N; i++)
	{
		if (D == 0)
			break;
		if (cake[i].store > D)
		{
			gain += cake[i].price * D;
			break;
		}			
		else
		{
			gain += cake[i].sell;
			D -= cake[i].store;
		}

	}
	printf("%.2lf",gain);//包留两位小数输出gain
	return 0;
}

1021 个位数统计 (15 分)

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[10];//表示0-9的个数
int main()
{
	int i;
	for (i = 0; i < 10; i++)
		num[i] = { 0 };
	char a[1010];
	int temp;
	scanf("%s", &a);
	for (i = 0; i < strlen(a); i++)
	{
		temp = a[i] - '0';
		num[temp]++;
	}		
	
	for (i = 0; i < 10; i++)
	{
		if (num[i] != 0)
		{
			printf("%d:%d\n",i,num[i]);
		}
	}		
	
}

1022 D进制的A+B (20 分)
记得要用do while格式,不然当数字为0的时候有错误

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int a, b, d;
	int sum;
	scanf("%d %d %d",&a,&b,&d);
	sum = a + b;
	int i;
	int num=0;
	int ans[10000];
	do
	{
		ans[num++] = sum % d;
		sum /= d;
	} while (sum != 0);
	for (i = num-1; i >=0; i--)
		printf("%d",ans[i]);
	
}

1023 组个最小数 (20 分)

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int m;
	int b[50];
	int i, j;
	int num = 0;
	int temp=0;
	for (int i = 0; i < 10; i++)
	{
		scanf("%d",&m);
		for (j = 0; j < m; j++)
			b[num++] = i;
	}	
	
	sort(b, b + num);//排序
	
	//排序完成后,找到将第一个不为零的数temp的下标,将前面的数依次向后挪一位,将b数组的第[0]位设置为temp
	for (int i = 0; i < num; i++)
	{
		if (b[i] != 0)
		{
			temp = b[i];
			for (j = i; j >= 1; j--)
				b[j] = b[j - 1];
			b[0] = temp;
			break;
		}
			
	}
	for (int i = 0; i < num; i++)
	{
		printf("%d",b[i]);
	}
	return 0;
}

1024 科学计数法 (20 分)

在这里插入代码片

1029 旧键盘 (20 分)
这题一开始想用set自动排序并去重,但是发现题目要按照输入的顺序输出,思路如下:
1、首先让字符串b内的字符hashtable都变为1
2、遍历字符串a内的字符,如果hash表内为0,则输出,让该字符的hash变为1,下一次遇到这个字符的时候不输出

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
int hashtable[37] = { 0 };
int main()
{	
	char a[100];
	char b[100];
	int i;
	int temp;
	int j;
	scanf("%s", a);
	scanf("%s", b);
	//下面给a和b去重
	for (i = 0; i < strlen(b); i++)
	{
		if (b[i] >= 'A' && b[i] <= 'Z')
			temp = b[i] - 'A' + 10;
		else if (b[i] >= 'a' && b[i] <= 'z')
			temp = b[i] - 'a' + 10;
		else if (b[i] >= '0' && b[i] <= '9')
			temp = b[i] - '0';
		else
			temp = 36;
		if (hashtable[temp] == 0)
			hashtable[temp] = 1;
	}

	for (i = 0; i < strlen(a); i++)
	{
		if (a[i] >= 'A' && a[i] <= 'Z')
			temp = a[i] - 'A' + 10;
		else if (a[i] >= 'a' && a[i] <= 'z')
			temp = a[i] - 'a' + 10;
		else if (a[i] >= '0' && a[i] <= '9')
			temp = a[i] - '0';
		else
			temp = 36;

		if (hashtable[temp] == 0)
		{
			if (a[i] >= 'a' && a[i] <= 'z')
			{
				a[i] = a[i] - 32;
			}			
			printf("%c",a[i]);
			hashtable[temp] = 1;
		}
	}
	return 0;
}

1028 人口普查 (20 分)
这题我都怀疑人生了,然后发现是num++的锅,还是亿点细节

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int judge(int day)//判断生日是否合法
{
	if (day < 20140907 && day > 18140905)
		return 1;
	else
		return 0;

}
struct vill {
	char name[8];
	int day;

}Vil[maxn];
bool cmp(vill a,vill b) //按照年长排序
{
	return a.day < b.day;
}
int main()
{	
	int n;
	int i, j;
	char a[15];
	char name[8];
	int year,  mouth, day;
	int num = 0;//合法生日的个数
	scanf("%d",&n);
	for (i = 0; i < n; i++)
	{
		year = mouth = day = 0;
		scanf("%s",name);
		scanf("%s", a);
		//printf("%s\n",a);
		//下面把字符串变成年月日
		for (j = 0; j < 10; j++)
		{
			if (j == 4||j==7)
				j++;
			if (j <= 3)
				year = year * 10 + a[j]-'0';
			else if (j <= 6)
				mouth = mouth * 10 + a[j]-'0';
			else if(j<10)
				day = day * 10 + a[j]-'0';
		}
		day = year * 10000 + mouth * 100 + day;
		if (judge(day))//如果合法
		{
			
			strcpy(Vil[num].name,name);			
			Vil[num].day = day;
			num++;
		}		
	}
	if (num != 0)
	{
		sort(Vil, Vil + num, cmp);
		printf("%d %s %s", num, Vil[0].name, Vil[num - 1].name);
	}
	else
		printf("0");	
	return 0;
}

1031 查验身份证 (15 分)
这道题目没有让输出异常的身份证个数,如果要先输出个数的话,需要将异常的身份证先转存,然后统一输出。

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char yichang[100][18];
int main()
{	
	int n;
	int i,j;
	char id[20];
	int temp;
	char jiaoyan;
	int sum=0;
	int quanzhong[17]{ 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
	char a[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
	scanf("%d",&n);
	int num = 0;
	for (i = 0; i < n; i++)
	{
		sum = 0;
		scanf("%s",id);
		for (j = 0; j < 17; j++)
		{
			sum += (id[j] - '0') * quanzhong[j];
		}
		
		temp = id[17];
		sum %= 11;
		if (a[sum] != temp)
		{
			printf("%s\n",id);
			num++;			
		}	
			
	}
	if (num == 0)
		printf("All passed\n");
	
	return 0;
}

1027 打印沙漏 (20 分)
这题注意最后没有剩下字符的时候,要在最后一行输出0
另外使用math.h里面的函数比如向下取整floor()很好用

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{	
	char c;
	double sum;
	scanf("%lf %c",&sum,&c);
	int n;
	n = floor(sqrt((sum + 1) / 2));
	int i;
	int j;
	for (i = n; i >0; i--)
	{
		for (j = 0; j < n - i; j++)
			printf(" ");
		for (j = 0; j < 2 * i - 1; j++)
			printf("%c", c);
		printf("\n");
	}
	for (i = 1; i <= n - 1; i++)
	{
		for (j = 1; j <= n-i-1; j++)
			printf(" ");
		for (j = 0; j < 1 + 2 * i; j++)
			printf("%c",c);
		printf("\n");
	}
	int temp;
	temp = sum + 1 - 2 * n * n;	
	printf("%d",temp);
	return 0;
}

1026 程序运行时间 (15 分)
注意输出要%02d不然测试点234答案错误

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{	
	int C1, C2;
	double miao;
	int s;
	scanf("%d %d",&C1,&C2);
	miao = (C2 - C1) * 1.0 / 100;
	if ((miao - (C2 - C1) / 100) >= 0.5)
		s = miao + 1;
	else
		s = miao;

	//下面求时分秒
	int hh, mm;
	hh = mm = 0;
	while (s >= 60)
	{
		if (s >= 3600)
		{
			hh++;
			s -= 3600;
		}
		else
		{
			mm++;
			s -= 60;
		}
	}
	printf("%02d:%02d:%02d",hh,mm,s);
	return 0;
}

1033 旧键盘打字 (20 分)
这题让我深深体会到了string的好处,以后一定要用起来!
一开始用scanf("%s",a)输入字符串,会有两个测试点报错,使用geline(cin,a),就好了,速度也变快了

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<string>
#include<stdlib.h>
using namespace std;
const int maxn = 100010;
int hashtable[67] = { 0 };//一开始所有的键都可以打出来
int main()
{
	string a, b;
	getline(cin, a);
	getline(cin, b);
	int i, j;
	for (i = 0; i < a.length(); i++)
	{
		if (a[i] >= '0' && a[i] <= '9')
			hashtable[a[i] - '0'] = 1;
		else if (a[i] >= 'A' && a[i] <= 'Z')
		{
			hashtable[a[i] - 'A' + 36] = 1;
			hashtable[a[i] - 'A' + 10] = 1;
		}
		else if (a[i] == '_')
			hashtable[62] = 1;
		else
		{

			if (a[i] == ',')
				hashtable[63] = 1;
			else if (a[i] == '.')
				hashtable[64] = 1;
			else if (a[i] == '-')
				hashtable[65] = 1;
			else
			{
				for (j = 36; j <= 61; j++)
					hashtable[j] = 1;
				hashtable[66] = 1;
			}

		}
	}

	int temp;
	int flag = 0;
	for (i = 0; i < b.length(); i++)
	{
		if (b[i] >= '0' && b[i] <= '9')
			temp = b[i] - '0';
		else if (b[i] >= 'a' && b[i] <= 'z')
			temp = b[i] - 'a' + 10;
		else if (b[i] >= 'A' && b[i] <= 'Z')
			temp = b[i] - 'A' + 36;
		else if (b[i] == '_')
			temp = 62;
		else if (b[i] == ',')
			temp = 63;
		else if (b[i] == '.')
			temp = 64;
		else if (b[i] == '-')
			temp = 65;
		else
			temp = 66;

		if (hashtable[temp] == 0)
		{
			printf("%c", b[i]);
			flag = 1;
		}

		else
			;
	}
	if (flag == 0)
		printf("\n");
	return 0;
}

1、我写的代码还是太冗长了,看到别人的题解,让hashtable开的大一点,比ascll字符的总数还大,比如hashtable[300],之后直接让hashtable[a[i]]=1,就可以了。
2、还有一开始我用hashtable[67]={1},以为所有元素都成1,其实是错误的,这样只有第一个元素是1。为了初始化的方便以后还是把所有元素都设置为0.
3、用stl解题,看着dl的题解留下菜鸡的眼泪

#include <iostream>
#include <cctype>
#include<string>
using namespace std;
int main() {
    string bad, should;
    getline(cin, bad);
    getline(cin, should);
    for (int i = 0, length = should.length(); i < length; i++) {
        if (bad.find(toupper(should[i])) != string::npos) continue;//转换成大写字母,如果在bad里面找到了,就不输出
        if (isupper(should[i]) && bad.find('+') != string::npos) continue;//如果是大写字母并且bad里面有+,也不输出
        cout << should[i];
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值