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不能忘
}
}