C语言数组(习题:大数相加)

  数组:实际上是一种批量定义变量的方法 

  定义:类型+数组名[数量]     比如 int num[20];

  初始化:数组的初始化还是蛮重要的,如果不进行初始化的话数组中的内容将会是随机值

 int num[5] = {1,2,3,4,5,6,7};

这样初始化会出现警告  最后只会显示前五个元素 

int num[5] = {1,2}

这样初始化会在最后自动补0

由于C语言中是没有批量显示数组的语句,所以要打印整个数组要配合for循环一起使用 并通过循环变量i来当做数组的下标

注意:计算数组的长度,如下所示,是将整个数组的大小除以单个数组元素的大小.

int len = sizeof(arr)/sizeof(arr[0]);

 

二维数组:二维数组将变量排成一个矩阵

定义: 类型+数组名[行数][列数]    批量显示需要双层for循环 外层for循环负责行号,内层for循环负责列号。

 

变长数组:

      普通数组的长度在编译时就确定了,因为编译器会对数组进行初始化,变长数组的长度在编译期间不能确定,在程序运行期间可以变化,但是一旦执行了定义数组的语句其长度就被固定了。变长数组涉及与结构体一起搭配使用 还是在结构体那章详细捋一捋好了。

课后作业:将两个正大数相加   

要求:两个数都是连续输入的 以回车分隔两个数  

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define N 100
int main(int argc, char const *argv[])
{
    char arr[N] = {};
    gets(arr);
    char brr[N] = {};
    gets(brr);
    
    int len1,len2,i = 0,j = 0;
    len1 = strlen(arr);
    len2 = strlen(brr);
    
    int len = len1>len2?len1:len2; 
        
    /*  c99之后数组初始化支持整型表达式,称为可变长数组,但按照c89的标准是不对的
    int num1[len]; //将字符串转换成翻转的整型数组
    int num2[len];
    */
    int* num1 = (int*)malloc(len*sizeof(int));
    int* num2 = (int*)malloc(len*sizeof(int));

    for (i = 0; i < len; i++)
    {
        num1[i] = i<len1 ? arr[len1-i-1]-'0':0;
    }
    for (j = 0; j < len; j++)
    {
        num2[j] = j<len2 ? brr[len2-j-1]-'0':0;
    }

    
    //int sum[len]; //定义和数组 
    int* sum = (int*)malloc(len*sizeof(int));
    int flag=0; //设进位符
    
    for (i = 0; i < len; i++)
    {
        sum[len-1-i] = (num1[i]+num2[i]+flag)%10;
        flag = (num1[i]+num2[i]+flag)/10;
    }
    
    if (flag == 1) printf("1");   //如果最高位有进位 则输出一个1 
    for (i = 0; i < len; i++)
    {
        printf("%d",sum[i]);
    }
    printf("\n");
    free(num1);
    free(num2);
    free(sum);
    num1 = NULL;
    num2 = NULL;
    sum = NULL;
    return 0;
}

写这道题时在这个地方犯了错:求数组长度len1,len2时,我一开始使用了sizeof(arr)/sizeof(arr[0])来求,结果得到len1和len2都为100 ,这个只是数组定义的长度,而不算是数组中有效元素的长度,在不知道长度的情况下应该用循环来求len出数组有效长度。

 

 

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值