#include <stdio.h> #define MAX_DEGREE 50 int main() { int m, n; int a[MAX_DEGREE + 1] = {0}, b[MAX_DEGREE + 1] = {0}, c[2 * MAX_DEGREE + 1] = {0}; // 输入第一个多项式 scanf("%d", &m); for (int i = 0; i < m; i++) { int coefficient, exponent; scanf("%d %d", &coefficient, &exponent); a[exponent] = coefficient; } // 输入第二个多项式 scanf("%d", &n); for (int i = 0; i < n; i++) { int coefficient, exponent; scanf("%d %d", &coefficient, &exponent); b[exponent] = coefficient; } // 相乘 for (int i = 0; i <= MAX_DEGREE; i++) { for (int j = 0; j <= MAX_DEGREE; j++) { if (a[i] != 0 && b[j] != 0) { c[i + j] += a[i] * b[j]; } } } // 输出结果 int nonzero_count = 0; for (int i = 2 * MAX_DEGREE; i >= 0; i--) { if (c[i] != 0) { printf("%d %d ", c[i], i); nonzero_count++; } } if (nonzero_count == 0) { printf("0 0"); } printf("\n"); return 0; }
时间: 2023-12-06 13:42:13 浏览: 103
这是一个用于计算两个多项式相乘的程序。首先,通过输入两个多项式的系数和指数来初始化两个数组a和b。然后,使用两层循环来遍历每个指数对,如果a和b中对应的系数都不为零,则将它们相乘并加到结果数组c的对应位置上。最后,遍历结果数组c,输出所有非零项的系数和指数。如果结果中没有非零项,则输出"0 0"。
这个程序的时间复杂度为O(n^2),其中n为多项式的最高次数。如果n非常大,程序的运行时间可能会很长。
相关问题
已有代码#include <stdio.h> #define MAX_VERTICES 100 int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵表示的图 int num_vertices; // 顶点数 int outdegree(int v) // 计算顶点v的出度 { int count = 0; for (int i = 0; i < num_vertices; i++) { if (graph[v - 1][i] != 0) { count++; } } return count; } int main() { // 假设图已经建立,并且顶点数为 num_vertices int v = 2; // 要求统计出度的顶点编号为2 int degree = outdegree(v); printf("Vertex %d has outdegree %d\n", v, degree); return 0; }写一段代码求它的任一顶点的出处
好的,如果你已经有了邻接矩阵表示的图和顶点数,那么你可以根据需要修改代码中的顶点编号 v,来求任一顶点的出度。例如,如果你想求第5个顶点的出度,可以将代码中的 v 改为 5,然后重新运行程序即可。
下面是一段示例代码,假设图已经建立,并且顶点数为 num_vertices,要求求第5个顶点的出度:
```c
#include <stdio.h>
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵表示的图
int num_vertices; // 顶点数
int outdegree(int v) // 计算顶点v的出度
{
int count = 0;
for (int i = 0; i < num_vertices; i++) {
if (graph[v - 1][i] != 0) {
count++;
}
}
return count;
}
int main()
{
// 假设图已经建立,并且顶点数为 num_vertices
int v = 5; // 要求统计出度的顶点编号为5
int degree = outdegree(v);
printf("Vertex %d has outdegree %d\n", v, degree);
return 0;
}
```
这段代码会输出第5个顶点的出度,你可以根据需要修改顶点编号 v 来求其他顶点的出度。
将下列代码改成六个结点10条边的无向图:#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大结点数 typedef struct ArcNode { // 弧结点类型 int adjvex; // 邻接点在顶点数组中的下标 struct ArcNode* next; // 指向下一个邻接点的指针 } ArcNode; typedef struct VertexNode { // 顶点类型 char data; // 顶点信息 ArcNode* firstarc; // 指向第一个邻接点的指针 } VertexNode, AdjList[MAX_VERTEX_NUM]; typedef struct Graph { // 图类型 AdjList vertices; // 顶点数组 int vexnum, arcnum; // 顶点数、弧数 } Graph; // 初始化图 void InitGraph(Graph* G) { G->vexnum = G->arcnum = 0; for (int i = 0; i < MAX_VERTEX_NUM; ++i) { G->vertices[i].data = '\0'; G->vertices[i].firstarc = NULL; } } // 添加结点 void AddVertex(Graph* G, char ch) { G->vertices[G->vexnum].data = ch; ++G->vexnum; } // 添加边 void AddEdge(Graph* G, int v1, int v2) { ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v2; p->next = G->vertices[v1].firstarc; G->vertices[v1].firstarc = p; ++G->arcnum; } // 输出每个结点的度 void PrintDegree(Graph* G) { for (int i = 0; i < G->vexnum; ++i) { int degree = 0; ArcNode* p = G->vertices[i].firstarc; while (p) { ++degree; p = p->next; } printf("结点%c的度为%d\n", G->vertices[i].data, degree); } } int main() { Graph G; InitGraph(&G); AddVertex(&G, 'A'); AddVertex(&G, 'B'); AddVertex(&G, 'C'); AddVertex(&G, 'D'); AddEdge(&G, 0, 1); AddEdge(&G, 0, 2); AddEdge(&G, 1, 2); AddEdge(&G, 2, 0); AddEdge(&G, 2, 3); AddEdge(&G, 3, 3); PrintDegree(&G); return 0; }
将代码改成六个结点十条边的无向图,可以按照以下方式修改:
1. 修改结点数为6,即将MAX_VERTEX_NUM改为6,同时在InitGraph函数中将G->vexnum初始值改为6。
2. 根据题目要求,顶点分别为A、B、C、D、E、F。因此在main函数中添加以下语句:
```
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddVertex(&G, 'E');
AddVertex(&G, 'F');
```
3. 添加边的过程中,注意无向图的边是双向的,因此需要添加两条边。具体来说,添加边的代码如下:
```
AddEdge(&G, 0, 1); // A-B
AddEdge(&G, 1, 0); // B-A
AddEdge(&G, 0, 2); // A-C
AddEdge(&G, 2, 0); // C-A
AddEdge(&G, 1, 2); // B-C
AddEdge(&G, 2, 1); // C-B
AddEdge(&G, 2, 3); // C-D
AddEdge(&G, 3, 2); // D-C
AddEdge(&G, 3, 4); // D-E
AddEdge(&G, 4, 3); // E-D
```
4. 最后,修改输出语句中的结点名称为题目给定的名称即可。修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 6 // 最大结点数
typedef struct ArcNode { // 弧结点类型
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode* next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VertexNode { // 顶点类型
char data; // 顶点信息
ArcNode* firstarc; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct Graph { // 图类型
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数、弧数
} Graph;
// 初始化图
void InitGraph(Graph* G) {
G->vexnum = 6;
G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; ++i) {
G->vertices[i].data = '\0';
G->vertices[i].firstarc = NULL;
}
}
// 添加结点
void AddVertex(Graph* G, char ch) {
G->vertices[G->vexnum].data = ch;
++G->vexnum;
}
// 添加边
void AddEdge(Graph* G, int v1, int v2) {
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v2;
p->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p;
++G->arcnum;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v1;
p->next = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p;
++G->arcnum;
}
// 输出每个结点的度
void PrintDegree(Graph* G) {
for (int i = 0; i < G->vexnum; ++i) {
int degree = 0;
ArcNode* p = G->vertices[i].firstarc;
while (p) {
++degree;
p = p->next;
}
printf("结点%c的度为%d\n", G->vertices[i].data, degree);
}
}
int main() {
Graph G;
InitGraph(&G);
AddVertex(&G, 'A');
AddVertex(&G, 'B');
AddVertex(&G, 'C');
AddVertex(&G, 'D');
AddVertex(&G, 'E');
AddVertex(&G, 'F');
AddEdge(&G, 0, 1); // A-B
AddEdge(&G, 1, 0); // B-A
AddEdge(&G, 0, 2); // A-C
AddEdge(&G, 2, 0); // C-A
AddEdge(&G, 1, 2); // B-C
AddEdge(&G, 2, 1); // C-B
AddEdge(&G, 2, 3); // C-D
AddEdge(&G, 3, 2); // D-C
AddEdge(&G, 3, 4); // D-E
AddEdge(&G, 4, 3); // E-D
PrintDegree(&G);
return 0;
}
```
阅读全文