C语言回顾 四 数组

   
数组是一种构造类型,相同数据类型构成新的数据类型。数组的每个成员成为一个数组元素。
最简单的数组是:一位数组。
一维数组的定义: 类型说明符 数组名【常量表达式】 = {值1,值2......};
在数组之中,有一些问题需要注意:
a.数组越界,很危险
b.数组元素个数可以省略,但是必须赋初值,否则没有办法决定元素的个数
c.数组不能直接参与运算,数组中的元素可以参与运算
d.定义数组必须有数据类型
e.取数组元素时,元素下标不能够省略
f.定义数组时,如果没有赋值,那么整型默认为0,字符型默认为'0'
g.%s打印遇到'\0'停止
h.元素的下标从0开始,元素下标的范围为[0, 数组元数个数 - 1]
例如: int array[3] = {1,2,3};  //int 定义元素的类型
          数组名: array             
          数组类型:int [3]  
          初始值: {1,2,3}
    //类型说明符:
    //定义一个数组(每个元素都是int类型)
    //注意: 定义数组时[]内只能是常量表达式,不能是变量;
    int array2[] = {};//定义数组时[]内的值不能是变量;
    int array[3] = {1, 3, 5};//array[0] array[1] array[2]
    printf("%d",array[2]);
    int array[3] 和array[3] (千万不要越界);
    float array[10] = {0};
    for (int i = 0; i <= 9; i++) {
    array[i] = arc4random() % (40 - 20 + 1) +20;
    printf("%.2f ",array[i]);//使用的事后array【可以使变量】,定义的时候不可以
    }
    
    short array1[5] = {1,2,3,4,5};
    for (int a = 0; a < 5; a++) {
        printf("%hd ",array1[a]);   }
    
    char a[5] = {'n','k','j','w','d'};
    for (int i = 0; i < 5; i++) {
        printf("%c ",a[i]);
    }
    
    //数组元素进行赋值array[下标] = 值
    int array[10] = {0};
    for (int i =0; i < 10 ; i++) {
        array[i] = arc4random() % (80 - 10 + 1) +10;
        printf("%d ",array[i]);
    }
    
    int a[20] ={0};
    int sum =0;
    for (int i = 0; i < 20; i++) {
        a[i] = arc4random() % (70 - 30 + 1) + 30;
        sum += a[i];
        printf("%d",a[i]);
    } printf("结果:%d ",sum);
    
    int a[20] = {0};
    int max =0;
    printf("数组的数据:");
    for (int i = 0; i < 20; i++) {
        a[i] = arc4random() % (70 - 30 +1) +30;
        printf("%d ",a[i]);
        if (max < a[i]) {
            max = a[i];
        }
    }printf("\n最大值:%d",max);
    //复制一个数组,即两个数组的容量一样,把其中一个数组的元素复制到拧一个数组中去
    //定义一个数组(赋初始值)
    int arr[] = {1, 4, 5, 7,9};
    //定义一个数组(赋值上边数组的内容);
    int arr1[5] = {0};//
    //把arr的内容复制到arr1中,并打印
    for (int i =0; i < 5; i++) {
        arr1[i] = arr[i];
        printf("%d ", arr1[i]);
    }
    
    int array[5] = {0};
    int array1[5] = {0};
    for (int i = 0; i < 5; i++) { //第一部分 随机数组1的五个值
        array[i] = arc4random() % ( 70 - 30 + 1) + 30;
        printf("%d ", array[i]);
    }printf("\n");
    for (int i = 0; i < 5; i++) {  //把数组1 的值 移动到 数组2中;
        array1[i] = array[i];
        printf("%d ",array1[i]);
    }
    
 生成两个数组,每个数组都有10个元素,元素取值40 --- 20 之间,数组对应的元素相加放到另一个数组中;
    int array[10] = {0}; //先定义三个相同容量的数组,并赋初值
    int array1[10] = {0};
    int array2[10] = {0};  
    for (int i = 0; i < 10; i++) {  //随机两个数组的值并移动到一个数组中
        array[i] = arc4random() % (40 - 20 + 1) + 20;
        array1[i] = arc4random() % (40 - 20 + 1) +20;
        array2[i] = array[i] + array1[i];  //数组中的元素相加
        printf("%d " ,array[i]);
    }printf("\n");//换行
    for (int i = 0; i <10; i++) {
        printf("%d ",array1[i]);
    }printf("\n");
    for (int i = 0; i < 10; i++) {
        printf("%d ",array2[i]);
    }
   
    数组排序
    方法比如:冒泡排序,选择排序,插入排序,归并排序;
    冒泡排序涉及双循环,外层控制循环趟数,内层控制比较次数
     9 6 5 8 2(小--大) 5个数(数组元素个数)
     第0趟 6 8 5 2 | 9    4次    次数= 个数 - 1 - 趟数;
     第1趟 6 5 2 | 8 9    3次   j = n - 1 -j;
     第2趟 5 2 | 6 8 9    2次
     第3趟 2 | 5 6 8 9    1次
    //作业1 冒泡排序 20遍 (手敲版);
    int array[5] = {9, 6, 5, 8, 2};
    for (int i = 0; i < 5 -1; i++) {  //比较趟数=数组元素n-1
        for (int j =0; j < 5 - 1 - i; j++) { //比较次数=n-1-趟次
            if (array[j] > array[j+1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }i
        }
    } for (int i = 0; i < 5; i++) {
        printf("%d ",array[i]);
    }
    
   //定义一个数组,并﹣初值,[]中的常量表达式不能为变量
    int a[10] ={0};
    int i =0;
printf("开始摇人:");
//随机出一个数组,并打印
    for(i = 0; i < 10; i++){
        a[i] = arc4random() % (40 -20 + 1) + 20;
        printf("%d ",a[i]);
    }
printf("\n");
//开始比较大小排序(冒泡)
    for (i = 0; i < 10 -1; i++) {   //趟数:i < n - 1;
        for (int j = 0; j < 10 - 1 - i; j++) {  //比较次数: j < n - 1 - i;
            //比较(第j个和第j+1个),如果第j个大于第j+1个交换;
            if (a[j] > a[j+1]) {
                int temp = 0;
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }printf("全体排队:");
    for (int i = 0; i < 10; i++) {
        printf("%d ",a[i]);
    }
    
//字符数组
    char c[] = {'i', 'p', 'h', 'o', 'n', 'e'};
    char c1[] = "iphone";//字符串有一个隐含的‘、0’作为结束标志,所以在存储的时候,字符的个数最多是元素的个数-1个;
    printf("****%lu\n",sizeof(c));// 6
    printf("****%lu",sizeof(c1));// 7
    
    //字符数组不一定是字符串(有\0结束标志的);
    //字符串一定是字符数组
    
    //1 单个字符的操作
    c1[0] = 'p'; //改变字符串的摸个字符的值;
    printf("\n");
    for (int i = 0; i < 6; i++) { //打印字符串中的某个字符
        printf("%c ",c1[i]);
    }
    
    //整个字符串的操作
    //打印整个字符串,占位符%s
    printf("\n%s",c1);
/*字符串的处理函数
 sizeof() 计算字节数,()内部可以是表达式也可以是类型
     strlen()  计算字符串⻓长度
     strcpy()  字符串拷⻉贝
     strcat()  字符串拼接
     strcmp()  字符串⽐比较
     注意: 有'\0'结束标志的才能使用
    
    //字符串长度(有效长度,既字符的个数);
    char str[10] = "iPhone"; //字节数=有效长度+1;char [10]定义字节数有10个
    printf("str所占的字节数:%lu\n",sizeof(str));//10  str[10]
    printf("str字符串的长度:%lu",strlen(str));//6
  
    //字符串拷贝(把一个字符串的内容拷贝到另一个字符串中);
    
    char strArr[] = "lanou";
    char atrArr1[6] = {0};
    //前一个位置,拷贝到哪
    //后一个位置,从哪拷贝
    //接收的数组一定不能比原来的数组小
    strcpy(atrArr1, strArr);
    printf("%s\n",strArr);
    
    
    //字符串拼接 ()
    char strArr[10] = "lanou";  //占10个字符,有效长度6
    char strArr1[] = "keji";
    //第一个位置,被拼接的字符
    //第二个位置,拼接的是什么
    //第一个位置需要有足够的空间
    strcat(strArr, strArr1);
    printf("%s\n",strArr);
    
    
    
    //字符串比较
    char ss1[] = "aaa";
    char ss2[] = "bbb";
    printf("%d",strcmp(ss2, ss1)); // 1    数组2>数组1为真
    /*将字符倒转
例如, "a f n p u e"   交换     交换     交换
        0 1 2 3 4 5   0《=》5  1《=》4  2《=》3
     转变 成字符串 “eupnfe”
    char str[] = "afnpue";
    for (int i = 0; i < strlen(str)/2; i++) {
        //交换第i个位置和第strlen(str) - 1 - i位置的值
        char temp = str[i];
        str[i] = str[strlen(str ) - 1 - i];
        str[strlen(str ) - 1 - i] = temp;
    }
    
    printf("%s",str);
     */
  
        return 0;
}





数组排序问题
1、问题描述
    数组排序(即按某种特定的顺序排列数据,如升序或降序)是最重要的计算应用之一,银行用帐号对所有的支票进行能够排序,并根据排序结果准备月底的财务报 告,学校学生成绩管理系统用数组排序的方法将考试成绩从高到低进行排名,数组排序方法很多,有直接插入排序、冒泡排序、快速排序、直接选择排序,下面来详 细介绍这四种基本的排序方法及其实现。
2、方法总结
   1)直接插入排序:数据表A中每个元素距其最终位置不远,数据表A按关键字值基本有序,可用此方法排序较快。
   2)冒泡排序法:将较小的值“上浮”到数组顶部,而较大值“下沉”到数组底部,这种排序技术要比较好几趟,每一趟要比较连续的数组元素对,如果某对数值是按升序排序的(或者这两个值相等),那就保持原样,如果某对数组是按降序排列的,就要交换它们的值。
   3)快 速排序法:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有 数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
   4)直 接选择排序法:直接选择排序的作法是:第一趟扫描所有数据,选择其中最小的一个与第一个数据互换;第二趟从第二个数据开始向后扫描,选择最小的与第二个数 据互换;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。它比起冒泡排序有一个优点就是不用不断的交换。
3、算法实现
    1)直接插入法实现
1.	#include<stdio.h>  
2.	#include<conio.h>  
3.	  
4.	int main()  
5.	{  
6.	        void InsertSort(int [],int);  
7.	        int a[7]={8,10,2,3,1,7,13};  
8.	        int i;  
9.	        InsertSort(a,7);  
10.	        for(i=0;i<7;i++)  
11.	           printf("%4d",a[i]);  
12.	        getch();  
13.	}  
14.	void InsertSort(int a[],int count)  
15.	{  
16.	        int i,j,temp;  
17.	        for(i=1;i<count;i++)     
18.	        {  
19.	           temp=a[i];  
20.	           j=i-1;  
21.	           while(a[j]>temp && j>=0)  
22.	           {  
23.	             a[j+1]=a[j];  
24.	              j--;  
25.	           }  
26.	           if(j!=(i-1))       
27.	             a[j+1]=temp;  
28.	         }  
29.	}  

      2)冒泡法实现 
1.	#include<stdio.h>  
2.	#include<conio.h>  
3.	int main()  
4.	{  
5.	         void BubbleSort(int []);  
6.	         int a[10];  
7.	         int i,j,temp;  
8.	         printf("Input tem integer numbers for a[10]:");  
9.	         for(i=0;i<10;i++)  
10.	            scanf("%d,",&a[i]);  
11.	         printf("\n");  
12.	         BubbleSort(a);  
13.	         printf("The sorted array is:\n");  
14.	            for(j=0;j<10;j++)  
15.	                 printf("%d,",a[j]);  
16.	         printf("\n\n");  
17.	         getch();  
18.	}  
19.	  
20.	void BubbleSort(int array[])  
21.	{  
22.	         int i,j,temp;  
23.	           for(j=0;j<9;j++)  
24.	              for(i=0;i<9-j;i++)  
25.	                 if(array[i]>array[i+1])  
26.	                  {  
27.	                      temp=array[i];  
28.	                      array[i]=array[i+1];  
29.	                      array[i+1]=temp;  
30.	                   }  
31.	}  

        3)快速排序法实现 
1.	#include<stdio.h>  
2.	#include<conio.h>  
3.	#define Max 8  
4.	  
5.	int main()  
6.	{  
7.	         void QuickSort(int a[],int p,int r);  
8.	         int a[]={2,8,7,1,3,5,6,4};  
9.	         QuickSort(a,1,Max);  
10.	         printf(" The sorted array is :");  
11.	            for(int i=0;i<Max;i++)  
12.	               printf("%d,",a[i]);  
13.	         printf("\n");  
14.	         getch();  
15.	}  
16.	  
17.	void QuickSort(int a[],int p,int r)  
18.	{  
19.	         int Partition(int a[],int p,int r);  
20.	         if(p<r)  
21.	         {  
22.	            int q=Partition(a,p,r);  
23.	            QuickSort(a,p,q-1);  
24.	            QuickSort(a,q+1,r);  
25.	         }  
26.	}  
27.	  
28.	int Partition(int a[],int p,int r)  
29.	{  
30.	         int i=p-1;  
31.	         int x=a[r-1];  
32.	            for(int j=p;j<r;j++)  
33.	            {  
34.	               if(a[j-1]<=x)  
35.	                {  
36.	                   i=i+1;  
37.	                   int temp;  
38.	                   temp=a[j-1];  
39.	                   a[j-1]=a[i-1];  
40.	                   a[i-1]=temp;  
41.	                 }  
42.	             }  
43.	         int temp;  
44.	         temp=a[i];  
45.	         a[i]=a[r-1];  
46.	         a[r-1]=temp;  
47.	         return i+1;  
48.	}  

        4)直接选择法实现 

1.	#include<stdio.h>  
2.	#include<conio.h>  
3.	  
4.	int main()  
5.	{  
6.	         void ChooseSort(int []);  
7.	         int i,j,a[10];  
8.	         printf("Input ten integer numbers for a[10]: ");  
9.	            for(i=0;i<10;i++)  
10.	               scanf("%d,",&a[i]);  
11.	         printf("\n");  
12.	         ChooseSort(a);  
13.	         printf("The sorted array is:\n");  
14.	            for(j=0;j<10;j++)  
15.	               printf("%d,",a[j]);  
16.	         printf("\n\n");  
17.	         getch();  
18.	}  
19.	  
20.	void ChooseSort(int array[])  
21.	{  
22.	         int j,temp,*p1,*p2;  
23.	         for(p1=array;p1<array+9;p1++)  
24.	            {   
25.	              j++;  
26.	              for(p2=array+j;p2<=array+9;p2++)  
27.	                if(*p2<*p1)  
28.	                  {  
29.	                     temp=*p2;  
30.	                     *p2=*p1;  
31.	                     *p1=temp;  
32.	                  }  
33.	            }  
34.	}  

4、各种方法比较
    1)时间性能比较
    按平均的时间性能来分,四种类排序方法时间复杂度分别为:
    直接插入排序法:O(n^2)
    冒泡排序法:O(n^2)
    快速排序法:O(nlogn)
    直接选择排序法:O(n^2)
    时间复杂度为O(n^2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特 别是对那些对关键字近似有序的记录序列尤为如此;当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序 而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。
    2)排序方法的稳定性能比较
    1.稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。
    2.当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。
    3.对于不稳定的排序方法,只要能举出一个实例说明即可。
    4.快速排序是不稳定的排序方法。


<think>好的,我现在要解决用户的问题:如何在C语言中实现二维数组的转置操作。用户之前已经询问过数组转置的概念,现在想具体了解在C语言中的实现方法。根据提供的引用内容,我需要整理出不同的实现方式,并确保符合用户的需求。 首先,用户提供的引用中有多个C语言示例代码,包括使用不同方法的转置实现,比如基础的双循环交换、自定义函数、处理不同维度数组,甚至涉及到旋转操作。我需要从中提取关键点,分步骤解释。 我需要先回顾用户之前的回答,其中提到了Python、JavaScript、Java的实现,现在用户转向C语言,可能需要对比或专门针对C语言的特性。用户可能希望了解基本的实现步骤、不同的方法(如是否使用函数、如何处理不同大小的数组)、以及可能的注意事项,比如内存管理或原地转置的问题。 接下来,我需要分析用户提供的引用内容。引用1到5展示了不同的C语言转置代码,包括: 1. 输入一个2x3数组,转置成3x2数组,使用双重循环,创建新数组。 2. 自定义函数实现3x3数组的转置,并在函数内部输出结果。 3. 另一个例子,固定初始化的2x3数组转置。 4. 使用宏定义SIZE处理3x3矩阵,通过函数实现转置,并打印结果。 5. 更复杂的例子,包括数组旋转90度和180度,可能涉及转置之外的步骤。 用户的问题集中在转置,而不是旋转,因此可能需要忽略引用5中的旋转部分。不过,引用5中的顺时针旋转90度可能涉及转置和镜像操作,但用户可能只需要基础转置。 现在需要将不同引用的方法分类,整理出不同的实现方式: - 基础方法:使用双重循环,遍历原数组,将元素复制到新数组的转置位置。 - 使用自定义函数:将转置逻辑封装成函数,提高代码复用性。 - 处理不同维度的数组:如2x3转3x2,或者方阵(3x3)。 - 动态输入与固定初始化:有的例子从用户输入读取数据,有的直接初始化数组。 用户可能需要一个分步骤的指南,涵盖这些不同情况。同时,需要注意在C语言数组作为函数参数传递的方式,比如传递二维数组时需要指定列数,或者使用指针。 另外,用户可能对原地转置(不创建新数组)感兴趣,但这通常只适用于方阵。例如,3x3的数组可以原地转置,交换元素a[i][j]和a[j][i],但需要避免重复交换,因此循环设计可能需要j从i开始,而不是从0开始。不过,引用中的例子都没有涉及原地转置,都是创建新数组。这可能是因为用户提供的例子都是处理非方阵的情况,或者原地转置需要更复杂的处理。如果用户的问题中没有明确提到原地转置,可能不需要深入讨论,但可以作为扩展内容提及。 现在需要组织回答结构,可能分为几个部分: 1. 基本实现步骤:使用双重循环创建新数组。 2. 封装成函数:如何将转置操作写成函数,处理不同大小的数组。 3. 处理方阵与非方阵的区别。 4. 动态输入与静态初始化。 5. 注意事项,如数组越界、函数参数传递等。 需要确保代码示例清晰,并且解释每个步骤的作用。同时,引用中的例子可以作为不同方法的示例,如引用1和3处理非方阵,引用4处理方阵,引用2和4使用函数。 可能的误区包括:在非方阵情况下无法原地转置,必须使用新数组;函数参数传递时二维数组的列数必须指定;循环变量的范围是否正确。 此外,用户可能想知道如何测试代码,比如如何输入数据或输出结果,因此需要在示例中包含输入输出部分,如引用1中的scanf和printf。 总结回答的结构: - 概述转置的概念。 - 基本实现方法(双重循环,创建新数组)。 - 使用自定义函数处理不同情况。 - 方阵与非方阵的处理。 - 动态输入与静态初始化示例。 - 注意事项和常见错误。 需要确保所有代码示例正确,并符合C语言的语法,比如数组声明、循环结构等。同时,引用对应的参考文献,如引用1、2、3、4中的不同方法。 最后,生成相关问题,帮助用户进一步学习,比如原地转置、函数参数处理、动态内存分配等。</think>### C语言实现二维数组转置的详细方法 #### 一、基础实现原理 二维数组转置的核心操作是交换行和列索引。若原数组为$m \times n$,转置后为$n \times m$,元素满足$b_{ji}=a_{ij}$。以下为两种典型场景的实现方法: --- #### 二、非方阵转置(例如2×3转3×2) **步骤说明**: 1. 定义原数组`a[2][3]`和目标数组`b[3][2]` 2. 通过双重循环遍历原数组,将元素赋值到转置位置 **代码示例**(参考[^1][^3]): ```c #include <stdio.h> int main() { int a[2][3] = {{1,2,3}, {4,5,6}}; int b[3][2]; // 转置操作 for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { b[j][i] = a[i][j]; // 行列索引交换 } } // 输出转置结果 printf("转置后的数组:\n"); for (int i=0; i<3; i++) { for (int j=0; j<2; j++) { printf("%d ", b[i][j]); } printf("\n"); } return 0; } ``` **关键点**: - 目标数组的维度需与原数组相反(如3×2) - 循环范围:原数组行数`i<2`,列数`j<3` --- #### 三、封装为自定义函数 **场景**:需要重复使用转置逻辑时,可将操作封装为函数。 **代码示例**(参考[^4]): ```c #include <stdio.h> #define ROWS 2 #define COLS 3 // 转置函数 void transpose(int src[ROWS][COLS], int dst[COLS][ROWS]) { for (int i=0; i<ROWS; i++) { for (int j=0; j<COLS; j++) { dst[j][i] = src[i][j]; } } } int main() { int a[ROWS][COLS] = {{1,2,3}, {4,5,6}}; int b[COLS][ROWS]; transpose(a, b); // 调用函数 // 输出结果(略) return 0; } ``` **注意事项**: - 函数参数需明确指定原数组的维度(如`src[ROWS][COLS]`) - 目标数组维度需提前定义(如`COLS×ROWS`) --- #### 、方阵原地转置(仅限$n \times n$数组**优化方法**:不创建新数组,直接在原数组上交换元素(需满足$i < j$以避免重复交换)。 **代码示例**: ```c #include <stdio.h> #define SIZE 3 void inplace_transpose(int arr[SIZE][SIZE]) { for (int i=0; i<SIZE; i++) { for (int j=i+1; j<SIZE; j++) { // 仅遍历上三角 int temp = arr[i][j]; arr[i][j] = arr[j][i]; arr[j][i] = temp; } } } int main() { int arr[SIZE][SIZE] = {{1,2,3}, {4,5,6}, {7,8,9}}; inplace_transpose(arr); // 输出结果(略) return 0; } ``` **关键点**: - 仅适用于方阵(行数=列数) - 内层循环从`j=i+1`开始,避免重复交换[^4] --- #### 五、动态输入与输出 **场景**:从用户输入读取数组数据并转置。 **代码示例**(参考[^1]): ```c #include <stdio.h> int main() { int a[2][3], b[3][2]; // 输入原数组 printf("输入2×3数组的元素:\n"); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { scanf("%d", &a[i][j]); } } // 转置并输出 for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { b[j][i] = a[i][j]; } } printf("转置结果:\n"); for (int i=0; i<3; i++) { for (int j=0; j<2; j++) { printf("%d ", b[i][j]); } printf("\n"); } return 0; } ``` --- #### 六、常见问题与注意事项 1. **数组越界**: - 需确保目标数组的维度正确(如2×3转置为3×2) - 循环终止条件应与数组维度严格匹配(如`i < ROWS`) 2. **函数参数传递**: - C语言中二维数组作为函数参数时,必须指定列数(如`int arr[][3]`)[^4] 3. **原地转置限制**: - 仅适用于方阵,非方阵必须使用新数组[^5] --- #### 七、扩展:矩阵旋转与转置的关系 引用[^5]中通过转置和镜像操作实现矩阵旋转(如顺时针90°)。 - **顺时针旋转90°** = 转置 + 列镜像 - **逆时针旋转90°** = 行镜像 + 转置 --- --相关问题--: 1. 如何在C语言中实现动态内存分配的二维数组转置? 2. 转置操作对稀疏矩阵的存储优化有何意义? 3. 如何通过指针操作高效实现二维数组转置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值