下面展示一些 内联代码片
。
// 鄙人不才,花了一整天才写完。通过PAT那一刻涕泪交加,
特写博客纪念。代码或许冗余,仅供各位大佬们娱乐一下。
代码是从Dev直接复制粘贴过来的,排版可能不是那么的好看。
本人用数组写的,非链表实现。
有不足的地方望能海涵指正。
希望各位看官看完点个赞。
举手之劳,却是我今后继续创作的最大激励。谢谢!
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
typedef struct list List;
struct list{
ElementType a,b;
};
List* Read();
List* Mutiply(List* A, List* B);
List* Add(List* A, List* B);
void Print(List* L);
int main(int argc, char *argv[]) {
List* A,*B;
A=Read();
B=Read();
Print(Mutiply(A,B));
printf("\n");
Print(Add(A,B));
return 0;
}
//a为系数,b为指数,数组第零项.a储存元素个数
List* Read(){
int n;
scanf("%d",&n);
List* A=(List*)malloc((n+1)*sizeof(List));
A[0].a=n;
A[0].b=1;
int i;
for(i=1;i<=n;i++) {
scanf("%d",&A[i].a);
scanf("%d",&A[i].b);
}
return A;
}
void move(List* C, List L, int place){
int i;
for(i=C[0].a;i>=place;i--) C[i+1]=C[i];
C[place]=L;
C[0].a++;
}
void Check(List* C){
int i,cnt=0;
int n=C[0].a;
for(i=1;i<=n;i++){
if(C[i].a==0){
cnt++;
C[0].a--;
}else C[i-cnt]=C[i];
}
}
List* Mutiply(List* A, List* B){
List* C=(List*)malloc((A[0].a*B[0].a+1)*sizeof(List));
C[0].b=0;
int i,j;//0为之前没有过,1为递降,2为递增。C[0].a为C多项式的个数,C[0].b为C多项式的增减状况及是否进入过第一次循环。
for(i=1;i<=A[0].a;i++){
for(j=1;j<=B[0].a;j++){
List L;
L.a=A[i].a*B[j].a;
L.b=A[i].b+B[j].b;
if(C[0].b){
if((L.b>C[C[0].a].b && C[0].b==2) || (L.b<C[C[0].a].b && C[0].b==1)) C[++C[0].a]=L;
else{
int i;
for(i=1;i<=C[0].a;i++){
if(C[0].b==1 && L.b>C[i].b){
move(C,L,i);
break;
}
else if(C[0].b==2 && L.b<C[i].b){
move(C,L,i);
break;
}
if(C[i].b==L.b){
C[i].a+=L.a;
break;
}
}
}
} else C[j]=L;
}
if(!C[0].b){
if(C[1].b<C[2].b) C[0].b=2;
else C[0].b=1;
C[0].a=B[0].a;
}
}
Check(C);
return C;
}
List* Add(List* A, List* B){
List* C=(List*)malloc((A[0].a+B[0].a+1)*sizeof(List));
C[0].a=0;
C[0].b=1;
int iA,iB,iC;
for(iA=1,iB=1,iC=1;iA!=A[0].a+1 && iB!=B[0].a+1;iC++){
if(A[iA].b==B[iB].b) {
C[iC].a=A[iA].a+B[iB].a;
C[iC].b=A[iA].b;
iA++;iB++;
}
else if(A[iA].b>B[iB].b)
{
C[iC]=A[iA];
iA++;
}
else {
C[iC]=B[iB];
iB++;
}
}
if(A[0].a>B[0].a){
int i;
for(i=iA;i<=A[0].a;i++) C[iC++]=A[i];
}
else{
int i;
for(i=iB;i<=B[0].a;i++) C[iC++]=B[i];
}
C[0].a=iC-1;
Check(C);
return C;
}
void Print(List* L){
int i;
if(L[0].a==0){
printf("0 0");
return;
}
if(L[0].b==1){
for(i=1;i<=L[0].a;i++){
printf("%d %d",L[i].a,L[i].b);
if(i!=L[0].a) printf(" ");
}
}else{
for(i=L[0].a;i>=1;i++){
printf("%d %d",L[i].a,L[i].b);
if(i!=L[0].a) printf(" ");
}
}
}