蓝桥杯练习day5

1.矩阵乘法

题目描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)

例如:

A =

1 2

3 4

A的2次幂

7 10

15 22
输入
第一行是一个正整数N、M(1< =N< =30, 0< =M< =5),表示矩阵A的阶数和要求的幂数

接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

解题分析:
是一道数学题,会做这一题要先会矩阵乘法,用多重循环解决

注意: 方阵的0次幂,是单位矩阵,即正对角线上的值都为1,其他值为0;

#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
    int a[30][30],b[30][30],c[30][30];
    int N,M;
    scanf("%d%d",&N,&M);
    for(int i=0; i<N; i++)  //给数组 a 赋值 
    {
        for(int j=0; j<N; j++)
        {
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];  
        }  
    }  
    if(M==0)  //M=0 , N阶矩阵的 0 次幂为单位矩阵 
    {
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                if(i==j)  a[i][j]=1;  else a[i][j]=0;
                printf("%d ",a[i][j]);    
            }
            printf("\n");
        }
    }
    else   //幂数非0的情况 
    {
        for(int i=1; i<M; i++)   //此层循环控制 m次幂 
        {
            memset(c,0,sizeof(c));
            for(int x=0; x<N; x++)     
            {
                for(int y=0; y<N; y++)
                {
                    for(int z=0; z<N; z++)
                        {
                        c[x][y] += a[x][z]*b[z][y];
                    }
                }
            }  
            for(int i=0; i<N; i++)
            {
                for(int j=0; j<N; j++)
                {
                    a[i][j] = c[i][j];
                }
            }
        }
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                printf("%d ",c[i][j]);
            }
            putchar('\n');
        }
    }
    return 0;
}

2.分解质因数

题目描述
求出区间[a,b]中所有整数的质因数分解。

提示

先筛出所有素数,然后再分解。

数据规模和约定

2< =a< =b< =10000

输入 :输入两个整数a,b。

解题分析:
虽然说是要求出所有素数再分解,这样就比较显而易见了

代码:

#include<stdio.h>
int sushu(int n)
{
    int a;
    for(a=2;a*a<=n;a++)
    {
        if(n%a==0) return a;
    }
    return n;
}
 
int main()
{
    int a,b,i,t=1,m;
 
    scanf("%d%d",&a,&b);
    for(i=a;i<=b;i++)
    {
        printf("%d=",i);
        t=sushu(i);
        m=t;
        if(t==i){printf("%d\n",i);continue;}
        else{
            printf("%d*",t);
            while(1)
            {
                t = sushu(i/m);
                if(t==1) break;
                m*=t;
                if(m!=i) printf("%d*",t);
                else printf("%d\n",t);
            }
        }
     
    }
 
    return 0;
}

3.矩形面积交

题目描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入
输入仅包含两行,每行描述一个矩形。

在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。 输出
输出:
仅包含一个实数,为交的面积,保留到小数后两位。

解题思路:
这题最好画一个图,就可以明白了.分别要求相对中间点,比较大小,看是否相交.

代码:

#include <stdio.h>
double min(double a, double b) {
    return a < b ? a : b;
}
double max(double a, double b) {
    return a > b ? a : b;
}
int main(void) {
    double x1, x2, x3, x4, y1, y2, y3, y4;
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
    double X = min(max(x1, x2), max(x3, x4));
    double Y = min(max(y1, y2), max(y3, y4));
    double X1 = max(min(x1, x2), min(x3, x4));
    double Y1 = max(min(y1, y2), min(y3, y4));
    if ((X > X1) && (Y > Y1)) {
        double S = (X - X1) * (Y - Y1);
        printf("%.2f\n", S);
    }
    else {
        printf("0.00\n");//由于没有赋值所以0不能忘
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值