C 자료구조&알고리즘
배열을 이용해 다항식 표현 및 연산 문제 review
제이지연
2022. 3. 21. 12:22
[1] 계수가 0이 아닌 항만 표현한 2개의 다항식을 입력받아 입력 다항식 및 결과 다항식을 출력하는 프로그램 작성.
① 다항식 덧셈
② 다항식 곱셈
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 10//최대항의갯수
typedef struct info {
int high;
int low;
}POLY;
int read_data(int max, POLY *f);
int sum(POLY f[][NUM], POLY *result, int *max);
int mul(POLY f[][NUM], POLY *result, int *num);
int main(){
int max[2], i, j, pr, num[2];
POLY form[2][NUM];
POLY result_s[NUM];
POLY result_m[NUM*2];
for(i=0;i<2;i++){
printf("최고차항 차수를 입력하시오 : ");
scanf("%d", &max[i]);
num[i]=read_data(max[i], form[i]);
}
/////////////////
pr=sum(form, result_s, num);
for(i=0;i<pr;i++){
printf("%dx^%d ", result_s[i].low, result_s[i].high);
}
printf("\n ============== \n");
pr=mul(form, result_m, num);
for(i=0;i<pr;i++){
printf("%dx^%d ", result_m[i].low, result_m[i].high);
}
}
int read_data(int max, POLY *f){
POLY get;
int para=0; //항의 개수 (!=최고차항 차수)
printf("계수-차수 순으로 입력하시오 : ");
while(scanf("%d-%d", &f->low, &f->high)!=EOF){
para++;
}
return para;
}
int sum(POLY f[][NUM], POLY *result, int *num){
int p1=0, p2=0, pr=0, i;
while(p1<num[0] && p2<num[1]){
if(f[0][p1].high==f[1][p2].high){
result[pr].high=f[0][p1].high;
result[pr].low=f[0][p1].low+f[1][p2].low;
p1++;
p2++;
pr++;
}
else if(f[0][p1].high<f[1][p2].high){
result[pr].high=f[1][p2].high;
result[pr].low=f[1][p2].low;
p2++;
pr++;
}
else{
result[pr].high=f[0][p1].high;
result[pr].low=f[0][p1].low;
p1++;
pr++;
}
}
if(p1>=num[0]){
for(i=p2;i<num[1];i++){
result[pr].high=f[1][p2].high;
result[pr].low=f[1][p2].low;
pr++;
}
}
else{
for(i=p1;i<num[0];i++){
result[pr].high=f[0][p1].high;
result[pr].low=f[0][p1].low;
pr++;
}
}
return pr;
}
int mul(POLY f[][NUM], POLY *result, int *num){
int i, j, pr=0;
POLY help[num[0]*num[1]];
for(i=0;i<num[0];i++){
for(j=0;j<num[1];j++){
help[pr].high=f[0][i].high+f[1][j].high;
help[pr].low=f[0][i].low*f[1][j].low;
pr++;
}
}
pr=0;
for(i=0;i<(num[0]*num[1]);i++){
if(help[i].high==help[i+1].high){
help[i+1].low+=help[i].low;
}
else{
result[pr].high=help[i].high;
result[pr].low=help[i].low;
pr++;
}
}
return pr;
}
[2] 원소값이 0이 아닌 (원소값은 random 하게 생성) 것만 표현한 2개의 임의의 행렬을 입력받아 입력받은 행렬과 행렬의 덧셈 및 곱셈 결과 행렬을 출력하는 프로그램 작성
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int row, col, flag, flag2, i, j, k;
scanf("%d*%d",&row, &col);
int str1[row][col];
int str2[row][col];
int str3[col][row];
for(i=0;i<row;i++){
for(j=0;j<col;j++){
str1[i][j]=rand()%10+1;
str2[i][j]=rand()%10+1;
str3[j][i]=rand()%10+1;
}
}
printf("행렬 출력\n");
printf("행렬1\n");
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d ", str1[i][j]);
}
printf("\n");
}
printf("행렬2\n");
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d ", str2[i][j]);
}
printf("\n");
}
printf("행렬3\n");
for(i=0;i<col;i++){
for(j=0;j<row;j++){
printf("%d ", str3[i][j]);
}
printf("\n");
}
//행렬 덧셈
int result_s[row][col];
for(i=0;i<row;i++){
for(j=0;j<col;j++){
result_s[i][j]=str1[i][j]+str2[i][j];
}
}
printf("출력\n");
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d ", result_s[i][j]);
}
printf("\n");
}
//행렬 곱셈
if(row<col){
flag=row;
flag2=col;
}
else{
flag=col;
flag2=row;
}
int result_m[flag][flag]={0,};
for(i=0;i<flag;i++){
for(j=0;j<flag;j++){
for(k=0;k<flag2;k++){
result_m[i][j]+=(str1[i][k]*str3[k][j]);
}
}
}
printf("출력\n");
for(i=0;i<flag;i++){
for(j=0;j<flag;j++){
printf("%d ", result_m[i][j]);
}
printf("\n");
}
}