中国大学慕课C语言第七讲作业

来源:互联网 发布:dhcp 默认端口 编辑:程序博客网 时间:2024/05/16 08:50

1. 多项式加法

题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。

输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

输出格式:
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20

输出样例:
4x6+6x5+12x3+12x2+12x+40
时间限制:500ms内存限制:32000kb

我实在写不出来,所以放上几个大神写的,方便自己学习。各位大佬先收下我的膝盖。。。(哭
1. happy_bigqiang大神的:
这里是链接

#include <stdio.h>#include <stdlib.h>#define SIZE 10/*1 注意flag的存放,不能放在for循环里面,否则每次for循环都置flag=0,导致内层else始终无法执行;2 判断条件中,arr[i]与i不要弄混了,这是逻辑错误3 总体思路,先按系数分三类1,每类1里面,按首项和其他项分类2,每类2里面再按指数不同分三种处理情况,对应输出不同格式*/int main(){    int coef,expo;    int cnt=0;    int arr[SIZE];    int i,flag;    for (i=0;i<SIZE;i++){        arr[i]=0;    }    while(scanf("%d %d",&expo,&coef)){        arr[expo] += coef; // 这一步忘了要可以实现重复加,所以要多个+号        if (expo == 0) cnt++;        if (cnt == 2) break;    }    //忘了加for 以便逆序输出int flag = 0;    //不能放在for循环里面,否则每次for循环都置flag=0,导致内层else始终无法执行;    for (i=SIZE-1;i>=0;i--){        if (arr[i]>1 || arr[i] <-1){ //判断条件中,arr[i]与i不要弄混了,这是逻辑错误            if (!flag){                flag = 1;                if (i>1){                    printf("%dx%d",arr[i],i);                }                else if (i == 1){                    printf("%dx",arr[i]);                }                else{                     printf("%d",arr[i]);                }            }            else {                    if (i>1){                        printf("%+dx%d",arr[i],i);                    }                    else if (i == 1){                        printf("+%dx",arr[i]);                    }                    else{                         printf("+%d",arr[i]);                    }            }        }        else if (arr[i] == 1){            flag = 1;            if (!flag){                flag = 1;                if (i>1){                    printf("x%d",i);                }                else if (i == 1){                    printf("x");                }                else{                     printf("1");                }            }            else {                    if (i>1){                        printf("+x%d",i);                    }                    else if (i == 1){                        printf("+x");                    }                    else{                         printf("+1");                    }            }        }        else if (arr[i] == -1){            if(!flag){                flag =1;                if (i>1){                    printf("-x%d",i);                }                else if (i == 1){                    printf("-x");                }                else {                    printf("-1");                }            }        }    }    if (flag == 0)        printf("0");    return 0;}

2. 这个是物理公司的大神写的:
这里写链接内容

#include <stdio.h>#include <math.h>void outNum(int j,int k){    int absk = abs(k);    if(absk==1 && j!=1 && j!=0)    {        printf("x%d",j);    }    else if(absk==1 && j!=0)    {        printf("x");    }    else if(absk==1)    {        printf("%d",absk);    }    else if(j==0)    {        printf("%d",absk);    }    else if(j==1)    {        printf("%dx",absk);    }    else    {        printf("%dx%d",absk,j);    }}int main(){    int num[101] = { (0) };    int cut = 0;    int ent = 0;    int i,j,k;    while(cut < 2)    {        k=0;        scanf("%d %d",&j,&k);        num[j] += k;        if(j==0)            cut++;    }    for(i=100;i>-1;i--)    {        j=i;        k=num[j];        if(k!=0)        {            ent++;            if(cut==2)            {                if(k<0)                    printf("-");                outNum(j,k);                cut ++;            }            else            {                if(k<0)                {                    printf("-");                    outNum(j,k);                }                else                {                    printf("+");                    outNum(j,k);                }            }        }    }    if(ent==0)        printf("0");    return 0;}

3. wxx0136大神的代码:
这个也最短的
这里是链接

#include <stdio.h>#include <Windows.h>int mi = 0;//幂int xiShu = 0;//系数int num[101];//多项式数组void getDuoXiangShi();int main() {    //初始化数组,因为幂最大为100,因此数组只需有101个元素即可,即0-100    for(int i=0;i<101;i++){        num[i] = 0;    }    //取第一个多项式    getDuoXiangShi();    //取第二个多项式    getDuoXiangShi();    //从最高幂开始,打印2个多项式的和    for (int i = 100; i >= 0; i--) {        if (num[i] != 0) {            if (i == 0) {                printf("%d", num[i]);            }            else if( i == 1)            {                printf("%dx+", num[i]);            }            else {                printf("%dx%d+", num[i], i);            }        }    }    printf("\n");    system("pause");    return 0;}void getDuoXiangShi(){    do    {        scanf_s("%d %d", &mi, &xiShu);        num[mi] += xiShu;//先把同样幂的系数合并     } while (mi != 0);}

4. 邓戈麟大神的代码:
链接在这里

#include <stdio.h>main(){    int a[101][2], b[101][2], c[101][2];    int i, j, m, n, cnt = 0;    for (i = 0; i < 101; i++)        /* a表清零 */    {        for (j = 0; j < 2; j++)        {            a[i][j] = 0;        }    }    for (i = 0; i < 101; i++)        /* b表清零 */    {        for (j = 0; j < 2; j++)        {            b[i][j] = 0;        }    }    for (i = 0; i < 101; i++)        /* c表清零 */    {        for (j = 0; j < 2; j++)        {            c[i][j] = 0;        }    }    do {        scanf("%d %d", &m, &n);        a[m][0] = m;        c[m][0] = m;        a[m][1] = n;    } while (m != 0);        /* 输入a表,输入c表的第0列幂,不输入c表的第1列系数 */    do {        scanf("%d %d", &m, &n);        b[m][0] = m;        c[m][0] = m;        b[m][1] = n;    } while (m != 0);        /* 输入b表,输入c表的第0列幂,不输入c表的第1列系数 */    for (i = 0, j = 1; i < 101; i++)        /* 统计c表的第1列系数 */    {        c[i][1] = a[i][1] + b[i][1];    }    for (i = 100; i > 1; i--)        /* 从c表的第100行开始循环,一直到第2行 */    {        if (c[i][1] != 0)        /* 只统计c表第1列系数不为0 */        {            if (c[i][1] == 1)        /* 如果c表第1列系数==1,比如40 1 */            {                if (cnt > 0)                /* 如果输出超过一次,记得前面加正号+ */                {                    printf("+");                }                printf("x%d", c[i][0]);        /* 输出x40 */            }            else if (c[i][1] == -1)        /* 如果c表第1列系数==-1,比如40 -1 */            {                printf("-x%d", c[i][0]);        /* 前面加负号-,系数-1省略,输出-x40 */            }            else        /* 其他情况,c表第1列系数不等于1,也不等于-1 */            {                if (c[i][1] < 0)                {                    printf("%dx%d", c[i][1], c[i][0]);        /* 系数小于0,直接输出 */                }                else                {                    if (cnt > 0)                    {                        printf("+");        /* 如果系数大于0,需要考虑是否第一次输出,不是第一次输出,需要前面加正号+ */                    }                    printf("%dx%d", c[i][1], c[i][0]);                }            }            cnt++;        }    }    if (c[1][1] != 0)        /* c表第1行第1列系数不等于0 */    {        {            if (c[1][1] == 1)        /* 如果c表第1列系数==1 */            {                if (cnt > 0)                {                    printf("+");        /* 如果输出超过一次,记得前面加正号+ */                }                printf("x");            }            else if (c[1][1] == -1)        /* 如果c表第1列系数==-1 */            {                printf("-x");            }            else            {                if (a[1][1] > 0 && cnt > 0)        /* 如果系数大于0,需要考虑是否第一次输出,不是第一次输出,需要前面加正号+ */                {                    printf("+");        /* 如果输出超过一次,记得前面加正号+ */                }                printf("%dx", c[1][1]);            }            cnt++;        }    }    if (c[0][1] != 0)    {        if (cnt > 0)        {            printf("+");        /* 如果系数大于0,需要考虑是否第一次输出,不是第一次输出,需要前面加正号+ */        }        printf("%d", c[0][1]);        cnt++;    }    if (cnt == 0)    {        printf("0");    }}

2. 鞍点

题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。

输入格式:
输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。

输出格式:
对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。
如果找不到,就输出
NO
题目所给的数据保证了不会出现多个鞍点。

输入样例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例:
2 1
时间限制: 500ms 内存限制: 32000kb
我的目前还没写出来,随后放上。

纯爱枫若情大神的:
链接在这里

//寻找一个方形矩阵的鞍点(saddle point)  #include <stdio.h>  int main(){      //读入一个数字,决定这个方形矩阵是几阶的      int n;      scanf("%d",&n);      //定义n阶矩阵以及将要用到的变量      int matrix[n][n];      int i,j,temp,count,flag=0;      //读入矩阵中的每一个数      for(i=0; i<n; i++){          for(j=0; j<n; j++){              scanf("%d",&temp);              matrix[i][j]=temp;          }      }      //测试读入的数据是否正确  /*  {          for(i=0; i<n; i++){              printf("%d\t",i);              for(j=0; j<n; j++){                  printf("%d\t",matrix[i][j]);              }              printf("\n");          }      }  */      //开始寻找鞍点      for(i=0; i<n; i++){            //找出每行中的最大的数字          temp=matrix[i][0];  //用temp与count标识出每行中最大的数字以及位置          count=0;          for(j=1; j<n; j++){              if(temp<matrix[i][j]){                     temp=matrix[i][j];                  count=j;              }          }          //测试一下,此行最大的数字,是否是其所在列的最小数字          for(j=0;j<n;j++){              if(matrix[j][count]<temp){                  flag++; //如果有数字小temp,flag就不为零              }          }          if(flag==0){    //测试flag值,如果为零,证明此数正是要找的鞍点              printf("%d %d\n",i,count);              break;          }          flag=0;      }      //如果没找到鞍数,循环终止,输出“NO”      if(i==n){          printf("NO");      }      return 0;  }  

网上的另一个clickyeah大神的:
链接在这里

#include <stdio.h>#define M 100#define N 100int main(void) {    int i,j,m,n;    int max,jmax,flag,f = 1;    int a[M][N];    while(scanf("%d",&n) != EOF){        for(i = 0; i < n; ++i)        for(j = 0; j < n; ++j)        scanf("%d",&a[i][j]);        for(i = 0; i < n; ++i){            max = a[i][0];            jmax = 0;            for(j = 1; j < n; ++j) { // 找出i行最大的                if(max < a[i][j]){                    max = a[i][j];                    jmax = j; // 且记录所在的列坐标               }            }            flag = 1; // 预置标志            int ii;            for(ii = 0; ii < n && flag; ++ii) { // 判断max是否为所在列最小的                if(a[ii][jmax] < max) // 不是                    flag = 0; // 则清标志            }            if(flag == 1){                printf("%d %d\n",i,jmax);                f = 0;            }        }        if(f) printf("NO\n");    }    return 0;}
原创粉丝点击