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");
	}
}