B-16、分解质因数
#include <iostream>
using namespace std;
#define N 10001 //多一位方便从1开始计数
bool num[N];//默认都为 false 看作为质数
//标记所有非质数为 true
void init(){
int i, j;
for(i = 2; i < N; ++i){
if(!num[i]){
//厄拉多塞筛法
for(j = i * i; j < N; j += i){
num[j] = true;
}
}
}
}
//分解质因数
void judge(int n){
if(!num[n]){ //本身即为质数
cout << n;
}else{
for(int j = 2; j <= n; ++j){
if(n % j == 0){ //找出质因数 j
cout << j << "*";
n /= j; //除去 j
judge(n); //递归判断新数
break;
}
}
}
}
int main() {
init();
int a, b, i;
cin >> a >> b;
for(i = a; i <= b; ++i){
cout << i << "=";
judge(i);
cout << endl;
}
return 0;
}
B-17、矩阵乘法
#include <iostream>
using namespace std;
int main(){
int n, m, i, j;
cin >> n >> m;
int **a = new int*[n];
for(i = 0; i < n; ++i){
a[i] = new int[n];
}
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
cin >> a[i][j];
}
}
//判断零次幂,输出单位矩阵
if( m == 0){
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
if( i == j){
cout << 1 << " ";
}else{
cout << 0 << " ";
}
}
if(i != n-1)
cout << endl;
}
return 0;
}
//申请数组保存结果
int **ans = new int*[n];
for(i = 0; i < n; ++i){
ans[i] = new int[n];
}
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
ans[i][j] = a[i][j];
}
}
//申请数组暂存运算中的和
int **temp = new int*[n];
for(i = 0; i < n; ++i){
temp[i] = new int[n];
}
int k, l;
m -= 1;
while(m--){
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
temp[i][j] = 0;
for(k = 0; k < n; ++k){
temp[i][j] += ans[i][k] * a[k][j];
}
}
}
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
ans[i][j] = temp[i][j];
}
}
}
for(i = 0; i < n; ++i){
for(j = 0; j < n; ++j){
cout << ans[i][j] << " ";
}
if(i != n-1)
cout << endl;
}
return 0;
}
B-18、矩形面积交
因为是矩形,且是对角坐标,所以两个坐标的x,y可以直接提取出来最大的和最小的作为主对角线上的顶角。
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
struct point{
double x, y;
}a, b, c, d, m, n;//相交矩形的右上角坐标m, 左下角坐标n
int main()
{
cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y >> d.x >> d.y;
m.x = min( max(a.x, b.x), max(c.x, d.x));
m.y = min( max(a.y, b.y), max(c.y, d.y));
n.x = max( min(a.x, b.x), min(c.x, d.x));
n.y = max( min(a.y, b.y), min(c.y, d.y));
if(m.x > n.x && m.y > n.y){
cout << setiosflags(ios::fixed) << setprecision(2);
cout << (m.x - n.x) * (m.y - n.y) << endl;
}
else
cout<< "0.00" <<endl;
return 0;
}