初学C语言之近日小结5

写在前面
这九天时间一直在家里充工,错过了两次打卡,这次的是把九天的内容总结一下:
前三天:
分解质因数改良
这次是改良了上次的分解质因数的代码,通过与学姐和同学的讨论,发现之前的判断素因数步骤是多余的,只需要加个判断n的整数范围的if,然后加入一个循环就可解决问题,下面是代码:

#include<stdio.h>
int main()
{
    int i,n;

    scanf("%d",&n);//读入整数n
    printf("%d=",n);//输出式子的表头

    if(2<=n<=100000){     //判断n的范围
        for(i=2;n>=i;i++){    //开始分解n
            while(n % i == 0){
                printf("%d",i);
                n = n / i;
                //如果n==1则是素数,否则输出x即*,继续分解,直到n为素数
                if(n != 1){
                    printf("x");
                }else{
                    break;
                }
            }
        }
    }
    return 0;
}

日后写代码时应该把雏形去简化,找到更简单的方法。

后六天:
MOOC第七章作业
这是题目:

多项式加法(10分)
题目内容:
一个多项式可以表达为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

目的是两组多项式相加然后输出结果,第一次写的代码过于繁琐,而且也不对,所以在这里就借用了张泽洋同学的代码,加上我自己的一点理解:

#include<stdio.h>

int main()
{
    int m,n;            //m为系数,n为幂次 
    int k,i;            //k为多项式组数,在本代码中只有两组 
    int flag = 0;
    int number[101] = {0};

    for (k=0;k<2;k++){   //循环两次 ,因为读入两组多项式 
        do{
            scanf("%d %d", &n,&m);
            number[n] = number[n] + m;   //省去幂次的数组,更加简便,同幂次系数先相加 
        }while(n != 0);
    }

    for(i=100;i>=0;i--){                //从所给范围的最高次幂开始逐级递减 
        if(number[i] != 0){             //判断系数是否为零 

            if(flag == 0){              //用这种方法跳过第一位数的"+" 
                flag = 1;
            }else if(number[i] > 0){    //用来判断系数正负,负数直接输出 
                printf("+");            //正数输出之前加一个"+" 
            }

            if(number[i] != 1){         //判断系数是否为1,若是1则不用输出,否则输出系数 
                printf("%d",number[i]);
            }

            if(i != 0){                 //若幂次不为零,输出x 
                printf("x",i);
                if(i != 1){             //若幂次不为1,输出幂次 
                    printf("%d",i);
                }
            }
        }
    }
    if(flag == 0){
        printf("0");                    //如果多项式里没有任何数就输出0       
    }
    return 0;
 } 

之前是写成系数一个数组,幂次一个数组,但是会很麻烦,这样写系数一个数组,幂次成为元素数量,相对来说更简单些。总结就是写代码之前要把情况想全面,不然很容易出差错。

对指针的理解(个人看法)
指针最基础的作用就是保存地址的变量,也可以作为参数。

int*p

*是一个单目运算符,用来访问指针的值所表示的地址的变量,没有”++”“–”优先级高。
指针可以用作交换两个变量的值:

void swap(int*pa,int*pb)
{
    int c = *pa;
    *pa = *pb;
    *pb = *pa;
}

数组和指针也有很大关系,数组变量是特殊的指针,因为数组变量本身表达地址。不过,数组变量是const的指针,所以不能被赋值。
但是数组单元表达的是变量,不能表达地址,所以数组单元取地址需要用&。
[]运算符可以对数组做,同时也可以对指针做,同样,*运算符对指针,数组都可以做。

malloc:用来申请空间

#include<stdlib.h>
void*malloc(size_t size)

向malloc申请的空间的大小是以字节为单位的。
当然,用malloc申请来的空间是需要还给“系统”的:
这时需要用free(),注意:只能还申请来的空间的首地址。

后话
只总结了第九章,第十,十一,十二章还在理解消化,就先不提,这几天进度较慢,等假期忙完开学的事情就开始心无旁骛的学习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值