PAT每日三题

1097 矩阵行平移

分数 20

作者 陈越

单位 浙江大学

给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的奇数行的元素整体向右依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一列元素的和。

输入格式:

输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。

接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。

输出格式:

在一行中输出平移后第 1 到 n 列元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

7 2 99
11 87 23 67 20 75 89
37 94 27 91 63 50 11
44 38 50 26 40 26 24
73 85 63 28 62 18 68
15 83 27 97 88 25 43
23 78 98 20 30 81 99
77 36 48 59 25 34 22

输出样例:

529 481 479 263 417 342 343

样例解读

需要平移的是第 1、3、5、7 行。给定 k=2,应该将这三列顺次整体向右平移 1、2、1、2 位(如果有更多行,就应该按照 1、2、1、2、1、2 …… 这个规律顺次向右平移),左端的空位用 99 来填充。平移后的矩阵变成:

99 11 87 23 67 20 75
37 94 27 91 63 50 11
99 99 44 38 50 26 40
73 85 63 28 62 18 68
99 15 83 27 97 88 25
23 78 98 20 30 81 99
99 99 77 36 48 59 25
n,k,x=list(map(int,input().split()))
arr=[]
for _ in range(n):
    t=list(map(int,input().split()))
    arr.append(t)
m=1
for i in range(0,n,2):
    for j in range(m):
        arr[i].insert(0,x)
    m+=1
    if m>k:
        m=1
brr=[0]*n
for j in range(n):
    s=0
    for p in range(n):
        brr[j]+=arr[p][j]
for i in range(n):
    if i+1==n:
        print(brr[i],end='')
    else:
        print(brr[i],end=' ')
        

若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。

输入格式:

输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104 的正整数。

输出格式:

对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No

输入样例:

3
18 29 40

输出样例:

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

bool isBeautiful(int N) {
    // 1. 找出所有因数
    vector<int> factors;
    for (int i = 1; i <= N; i++) {
        if (N % i == 0) {
            factors.push_back(i);
        }
    }
    
    int size = factors.size();
    // 2. 四重循环枚举不同的四个因数
    for (int a = 0; a < size; a++) {
        for (int b = a + 1; b < size; b++) {
            for (int c = b + 1; c < size; c++) {
                for (int d = c + 1; d < size; d++) {
                    // 使用long long防止溢出
                    long long sum = (long long)factors[a] + factors[b] + factors[c] + factors[d];
                    if (sum % N == 0) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

int main() {
    int K;
    cin >> K;
    for (int i = 0; i < K; i++) {
        int num;
        cin >> num;
        if (isBeautiful(num)) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}

1094 谷歌的招聘

分数 20

作者 陈越

单位 浙江大学

2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。

prime.jpg

自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921... 其中粗体标出的 10 位数就是答案。

本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。

输入格式:

输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。

输出格式:

在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出 404。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。

输入样例 1:

20 5
23654987725541023819

输出样例 1:

49877

输入样例 2:

10 3
2468001680

输出样例 2:

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

bool is_prime(int a) {
	if (a < 2) {
		return false;
	}
	else if (a == 2) {
		return true;
	}
	else if (a % 2 == 0) {
		return false;
	}
	else {
		for (int i = 3; i * i <= a; i++) {
			if (a % i == 0) {
				return false;
			}
		}
		return true;
	}
}


int main() {

	int n, m;
	cin >> n >> m;
	string s;
	cin >> s;
	int f = false;
	for (int i = 0; i <= n - m; i++) {
		string t = s.substr(i, m);
		if (is_prime(stoi(t))) {
			cout << t << endl;
			f = true;
			break;
		}
	}
	if (f == false) {
		cout << "404" << endl;
	}



	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值