#P2034. 计算机笔试复习题.5

计算机笔试复习题.5

下面一题用到了 STL 模板。可以跳过本题

在另一份复习题中有另外一题是不基于 STL 模板的,可以直接训练那一题

(3)分解质因数

从小到大打印正整数 n 的所有质因数(既是质数,又是 n 的因数的数)

样例

输入: 20

输出: 2 5

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	vector<int> fac;
	int i;
	for (i=2; i<= n; ++i){
		if( 填空(1) ){
			bool isprime = true;
			for (int j=0;j<fac.size();j++){
				if( 填空(2) )
				{
					isprime = 填空(3);
					break;
				}
			}
			if( 填空(4) ) fac.push_back(i);
		}
	}
	for (int k=0; k<fac.size(); ++k) {
		cout << 填空(5) << " ";
	}
}
  1. 填空(1) 处应填 {{ select(1) }}
  • n%i== 0
  • n % i == 1
  • n % (i-1) == 0
  • n % (i-1) == 1
  1. 填空(1) 处应填 {{ select(2) }}
  • i % fac[j] == 0
  • fac[j] % i == 0
  • i % fac[j] != 0
  • fac[j] % i != 0
  1. 填空(3) 处应填 {{ select(3) }}
  • false
  • true
  • ( i < = fac[j] )
  • ( i == fac[j] )
  1. 填空(4) 处应填 {{ select(4) }}
  • n % i == 0
  • i < = fac.size()
  • isprime
  • ! isprime
  1. 填空(5) 处应填 {{ select(5) }}
  • n/fac[k]
  • fac[k]
  • fac[k]-1
  • n/(fac[k]-1)

(4)魔术数组

一个 N 行 N 列的二维数组,如果它满足如下的特性,则成为 “魔术数组”

  1. 从二维数组任意选出 N 个整数。

  2. 选出的 N 个整数都是在不同的行且在不同的列。

  3. 在满足上述两个条件下,任意选出来的 N 个整数的总和都是相等的。

例如,这是一个 4x4 的二维数组:

140 80 160 60
90 30 110 10
100 40 120 20
130 70 150 50

你会发现,任意从里面选出 4 个来自不同行和不同列的整数,它们的总和都是 340,所以这个一维数组是“魔术数组”。

现在给出整数 N,给出二维数组第一行的 N 个整数,再给出二维数组的左上角到右下角的对角线上的 N 个整数。你的任务是根据给出的数据,构造满足题意的“魔术数组”。 如果有多种方案,输出任意一种方案,如果没有方案,输出 -1 。

试补全程序:

#include<iostream>t
using namespace std;
int n,a[105][105];
int main()
{
	cin>>n;
	for(int j=1;j<=n;i++)
		cin>>a[ 填空(1) ][j];//输入首行数据

	for(int i=1;i<=n;i++)
		cin>> 填空(2) ;//输入左上角到右下角的对角线上的数据
	
	for(int j=1;j<n;i++)
	{
		for(int i=j+1;i<=n;i++)
		{
			填空(3); //填充部分数据
		}
	}

	for(int i=2;i<=nii++)
	{
		for(int j= 填空(4) ;j<=n;j++)//循环
		{
			填空(5); ////填充剩余数据
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;i++)
			cout<<a[i][j]<<' ';
		
		cout<<endl;
	}
	return 0;
}
  1. 填空(1) 处应填 {{ select(6) }}
  • 1
  • n
  • i
  • j
  1. 填空(2) 处应填 {{ select(7) }}
  • a[1][i]
  • a[i][1]
  • a[i][i]
  • a[i][j]
  1. 填空(3) 处应填 {{ select(8) }}
  • a[i][j] = a[i][i] + a[j][j] - a[i][j]
  • a[i][j] = a[1][j] + a[j][j] - a[1][i]
  • a[i][j] = a[1][i] + a[i][i] - a[1][j]
  • a[i][j] = a[1][j] + a[i][i] - a[1][i]
  1. 填空(4) 处不应填 {{ select(9) }}
  • i+1
  • i
  • 1
  • 2

题目这样出其实是不好的,因为这个地方和 填空(5) 关联。如果是自由写程序,填空(5) 那个位置有很多种写法,而这个填空(4)问的是不能填什么,这样问其实很绕。

必须先完成 填空(5),再来做填空(4)

  1. 填空(5) 处应填 {{ select(10) }}
  • a[i][j] = a[i][j-1] + a[i-1][j-1] - a[i-1][j]
  • a[i][j] = a[i-1][j-1] + a[i-1][j] - a[i][j-1]
  • a[i][j] = a[i][j-1] + a[i-1][j] - a[i-1][j-1]
  • a[i][j] = a[i-1][j-1] + a[i-1][j] - a[i-1][j]