PAT (Basic Level) Practice (中文)

1002 写出这个数 (20 分)

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^​100
​​
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu

PS: 自然数n的类型,因为数值可能会很大,所以这里使用字符串来记录输入,之后读取每一个字符与字符0相减求和
PS: char *p[10] = {“ling”,“yi”,“er”,“san”,“si”,“wu”,“liu”,“qi”,“ba”,“jiu”};

#include <bits/stdc++.h>
using namespace std;

int main(){
    int sum;
    char *p[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

    string n;
    cin >> n;
    for (int i = 0; i < n.length(); i++){
        sum += n[i] - '0';
    }
    
    int r[100], j=0;
    while(sum != 0){
        r[j++] = sum % 10;
        sum /= 10;
    }
    
    for(j--; j>=0; j--){
        cout << p[r[j]];
        if(j != 0){
            cout << " ";
        }else{
            cout << endl;
        }
    }
    
    return 0;
}

1004 成绩排名 (20 分)

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112

#include<bits/stdc++.h>
using namespace std;

struct Student{
    string name,no;
    int score;
};

int main(){
    int n;
    cin >> n;
    Student stu[n];
    for(int i = 0; i < n; i++){
        cin >> stu[i].name >> stu[i].no >> stu[i].score;
    }
    int max=stu[0].score, min=stu[0].score;
    int m1=0, m2=0;
    for(int i=1; i<n; i++){
        if(max < stu[i].score){
            max = stu[i].score;
            m1 = i;
        }
    }
    cout << stu[m1].name << " " << stu[m1].no << endl;
    for(int i=1; i<n; i++){
        if(min > stu[i].score){
            min = stu[i].score;
            m2 = i;
        }
    }
    cout << stu[m2].name << " " << stu[m2].no << endl;
    
    return 0;
}

1013 数素数 (20 分)

令 P​i表示第 i 个素数。现任给两个正整数 M≤N≤10^4,请输出 PM到P​N的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 PM到 PN的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

法a
先计数找素数,计到第m个就结束,另起一个函数进行输出

#include<bits/stdc++.h>
using namespace std;

//判断素数
int isPrim(int a){
    for(int i = 2; i <= sqrt(a); i++){
        if(a % i == 0){
            return 0;
        }
    }
    return 1;
}

int main(){
    int m, n;
    cin >> m >> n;
    int num = 0;
    int i = 2;
    int cnt = 0;
    while(1){
    	if(isPrim(i))
    		num++;
    	if(num == m)
    		// 到第m个,开始要输出了 
    		break;
    	i++;
	}
	
	while(num <= n){
		if(isPrim(i)){
			cout << i;
			num++;
			cnt++;
			if(cnt!=10 && num <= n)
			    //注意num多1
				cout << " ";
			else{
				cout << endl;
				cnt = 0;
			}					
		}
		i++;		
	}
    
    return 0;
}

法b(格式错了)
将素数存到数组中,以空间换时间

#include<bits/stdc++.h>
using namespace std;

//判断素数
int fun(int a){
    int k = 0;
    for(int i = 2; i <= sqrt(a); i++){
        if(a % i == 0){
            k = 1;
            break;
        }
    }
    return k;
}

int main(){
    int m, n;
    cin >> m >> n;
    int *a = new int[n+1];
    int i = 1; //数组下标 
    int j = 2; //遍历数 
    while(i<=n){
    	if(fun(j) == 0){
    		//是素数
			a[i++] = j; 
		}
		j++;
	}
	
	for(int i = m; i <= n; i++){
		cout << a[i];
		if((i-m+1)%10 == 0)
			cout << endl;
		else
			cout << " ";
	}

    if((n-m+1)%10 != 0)
    	cout <<endl;
    
    return 0;
}

法c 埃氏筛法 筛选素数
将素数存到数组中,以空间换时间

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1000001;
int prime[maxn];  //素数列表 
int num = 0;  //第几个 
bool p[maxn] = {0};

void Find(int n){
	for(int i = 2; i < maxn; i++){
	    //一个个找,那最小的那个肯定是素数,无需判断 
		if(p[i] == 0){
			prime[num++] = i;
            if(num >= n)
                break;
			for(int j=i+i; j<maxn; j+=i)
				p[j]=1;
		}
	}
    
}

int main(){
    int M, N;
    cin >> M >> N;
    Find(N);
    int cnt = 0;
    for(int i = M; i <= N; i++){
        cout << prime[i-1];
        cnt++;
        if(cnt!=10 && i<N)
            cout << " ";
        else{
            cout << endl;
            cnt = 0;
        }
    }
    return 0;
}

1016 部分A+B (15 分)

正整数 A 的“D​A(为 1 位整数)部分”定义为由 A 中所有 DA组成的新整数 PA。例如:给定 A=3862767,DA =6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。

输入格式:
输入在一行中依次给出 A、DA 、B、DB,中间以空格分隔,其中 0<A,B<10^10。

输出格式:
在一行中输出 PA+PB的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
PS: s1.find(s2) 在s1中找s2,并返回位置
PS: int 转化为字符 char ta = ‘0’ + da;

#include<bits/stdc++.h>
using namespace std;

int main(){
    string sa, sb;
    int da, db;
    int pa = 0,pb = 0;
    cin >> sa >> da >> sb >> db;

    // 转化为字符
    char ta = '0' + da;
    char tb = '0' + db;

    while(sa.find(ta) != -1){
        // 不停的找ta
        sa[sa.find(ta)] = '!';
        pa = pa * 10 + da; 
    }

    while(sb.find(tb) != -1){
        sb[sb.find(tb)] = '!';
        pb = pb * 10 + db; 
    }

    cout << pa + pb << endl;

    return 0;
}

1021 个位数统计 (15 分)

给定一个 k 位整数 N=d​k−110​k−1+⋯+d1101+d0(0≤d​i≤9, i=0,⋯,k−1, ​k−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:
100311
输出样例:
0:2
1:3
3:1

#include<bits/stdc++.h>
using namespace std;
int num[10]; //全局,自动填0
int main(){
    string n;
    cin >> n;
    // int num[10] = {0};
    for (int i = 0; i < n.length(); i++){
        num[n[i] - '0']++;
    }
    for(int i = 0; i<10; i++){
        if(num[i] != 0){
            cout << i << ":" << num[i] << endl;
        }
    }
}

1027 打印沙漏 (20 分)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:

*****
 ***
  *
 ***
*****
2

画图题 找规律

#include<bits/stdc++.h>
using namespace std;

int main(){
	int N;
	char c;
	cin >> N >> c;
	
	// 找单个有几行 
	int num = 0, k=0;
	while(num <= N){
		k++;
		if(k==1){
			num += 1;
		}else{
			num += 2 * (2 * k -1);
		}
		//cout <<num << " "<< k << endl;
	}
    // num和k都是多了一次 
	if(k==1){
		num -= 1;
	}else{
		num -= 2 * (2 * k -1);
	}
	k -= 1;	
	
	//输出 
	for(int i=k; i>0; i--){
		for(int j=1; j<=k-i; j++){
			cout << " ";
		}
		for(int j=1; j<=2*i-1; j++){
			cout << c;
		}
		cout << endl;
	}
	
	for(int i=2; i<=k; i++){
		for(int j=1; j<=k-i; j++){
			cout << " ";
		}
		for(int j=1; j<=2*i-1; j++){
			cout << c;
		}
		cout << endl;
	}
	cout << N-num << endl;
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值