C的小算法集合

来源:互联网 发布:软件系统业务流程图 编辑:程序博客网 时间:2024/05/22 00:29
//我告诉自己,是时候好好弄一下C语言了,因为不懂C,真的就不懂底层的东西,所有的//都要在熟练运用C以后,这是非常重要的//什么是质数,只能被1和自身整除的数就是质数//1既不是质数也不是合数int is_zhi(int num)//1.判断基准{    if(num <= 1)        return 0; //不是    else if(num ==2 || num ==3)        return 1;    else     //2一次相加,如果又一次可以整除,就说明不是质数    {   int flag = 1;        for(int i=2;i<num;i++)        {            if(num%i == 0)            {                flag = 0;                break;            }        }        return flag;    }}
1 #include <stdio.h>2 #include <stdlib.h>        //获取斐波那契数列的同乡4 int get_item(int item)5 {6     if(item == 0 || item == 1)7         return 1;8     else9     {10         return  get_item(item-1) + get_item(item-2);11     }12 }1314 int main()15 {16     int ret;17     scanf("%d",&ret);18     ret = get_item(ret);19     printf("ret=%d \n",ret);20     return 1;21 }

#include <stdio.h>#include <stdlib.h>#define N 10int main(){    //我们需要搞定一个什么样的事情呢,需要打印一个N行和N列的矩阵    int arr[N][N];    int i,j;    for(i=0;i<N;i++)    {        for(j=0;j<N;j++)        {            arr[i][j] = i*N+j+1;            printf("%-5d",arr[i][j]);        }        printf("\n");    }    //打印出对角线的数字,看起来真的很美    for(i=0;i<N;i++)    {        for(j=0;j<N;j++)        {            arr[i][j] = i*N+j+1;            if(i == j)                printf("%-5d",arr[i][j]);            else                printf("%-5d",0);        }        printf("\n");    }}1    2    3    4    5    6    7    8    9    1011   12   13   14   15   16   17   18   19   2021   22   23   24   25   26   27   28   29   3031   32   33   34   35   36   37   38   39   4041   42   43   44   45   46   47   48   49   5051   52   53   54   55   56   57   58   59   6061   62   63   64   65   66   67   68   69   7071   72   73   74   75   76   77   78   79   8081   82   83   84   85   86   87   88   89   9091   92   93   94   95   96   97   98   99   1001    0    0    0    0    0    0    0    0    00    12   0    0    0    0    0    0    0    00    0    23   0    0    0    0    0    0    00    0    0    34   0    0    0    0    0    00    0    0    0    45   0    0    0    0    00    0    0    0    0    56   0    0    0    00    0    0    0    0    0    67   0    0    00    0    0    0    0    0    0    78   0    00    0    0    0    0    0    0    0    89   00    0    0    0    0    0    0    0    0    100  
#include <stdio.h>#include <stdlib.h>#define I 2#define J 3int main(){    //我们需要搞定一个什么样的事情呢,需要打印一个N行和N列的矩阵    int arr[I][J];    int i,j;    for(i=0;i<I;i++)    {        for(j=0;j<J;j++)        {            arr[i][j] = i*2+j+1;           printf("%5d",arr[i][j]);        }        printf("\n");    }    int ret[J][I];    for(i=0;i<J;i++)    {        for(j=0;j<I;j++)        {            //这一句是矩阵转置的精髓            ret[i][j] = arr[j][i];            printf("%5d",ret[i][j]);        }        printf("\n");    }}1    2    33    4    51    32    43    53    5

int main()  //注意指针的类型,int* *p这样就好理解这样一个二级指针了 char* *二级指针准确来说应该这样写{    int num = 100; //数字100    int *p = &num; //p=num的地址, *p = 100    int **pp = &p; //定义一个int *类型的变量来指向p的地址,注意指针的类型    printf("p=%p \n",p);    int *pointer = *pp;//*pp是p的地址,将pointer指针赋值p    printf("pointer=%p\t*pointer=%d \n",pointer,*pointer);    return 0;}

int main(){    int arr[7] = {1,2,3,4,5,6,4};   //这里说明了一个问题,arr,和 &arr地址都是0x7fff5fbff840    //但是它们的大小确不一样,原理是一个指针地址虽然首地址虽然相同,但是到什么地方结尾是要看你指向的类型的    printf("%p,%p \n",arr,&arr);    printf("%d,%d \n",sizeof(*arr),sizeof(*(&arr)));    int *p = arr;    int (*pp)[5] = &arr; //申明一个指针数组    printf("%d",(*pp)[1]);    return 0;}int maina() //从这里可以看出指针的大小都是相同的,不同是指向的数据的大小不同{    char ch = 'A';    int num = 100;    double db = 10.8;    char *p1 = &ch;    int *p2 = &num;    double *p3 = &db;    int **pp2 = &p2;    printf("%d,%d,%d,%d \n",sizeof(p1),sizeof(p2),sizeof(p3),sizeof(pp2));    return 0;}

//需要搞定一个什么样的事情呢,我需要搞定用malloc函数来动态的创建函数int num;scanf("%d",&num);int *p = malloc(sizeof(int)*num);for(int i=0;i<num;i++){    p[i] = i;    printf("%p,%d \n",&p[i],p[i]);}//数组是有大小限制的在C语言当中,所以我们这样动态分配就可以满足了

//这里总结指针的使用//指针的概念//首地址和步长值,步长值是有指针将解析成什么地址决定的//char,int,double,unsinged int,float,array(),pointer,function//指针的申明,直接用变量 int *p,数组本身就是指针,数组时连续的内存单元,所以可以用malloc动态分配//二级指针保存的事一级指针的地址,作用是来改变一级指针的指向//动态分配内存时必须要指定指针的类型,之后一定要free掉内存//memset,strcpy

下面都是结构体的知识
int main(){    //需要搞定一个什么样的事情呢,我需要搞定用malloc函数来动态的创建函数    int num;    scanf("%d",&num);    int *p = malloc(sizeof(int)*num);    for(int i=0;i<num;i++)    {        p[i] = i;        printf("%p,%d \n",&p[i],p[i]);    }    //数组是有大小限制的在C语言当中,所以我们这样动态分配就可以满足了    return 0;}//这里总结指针的使用//指针的概念//首地址和步长值,步长值是有指针将解析成什么地址决定的//char,int,double,unsinged int,float,array(),pointer,function//指针的申明,直接用变量 int *p,数组本身就是指针,数组时连续的内存单元,所以可以用malloc动态分配//二级指针保存的事一级指针的地址,作用是来改变一级指针的指向//动态分配内存时必须要指定指针的类型,之后一定要free掉内存//memset,strcpy#define DD struct nameinfostruct nameinfo{    char name[50];    char phone[12];    int num;};//需要搞定一个什么问题呢,就是无名结构体的用处,一般无名结构不能被别人使用,只有在定义的时候赋值给几个变量struct  //这里就是无名结构体{    char name[50];    char addr[50];}N1,N2;int maindfs(){    DD d1;    strcpy(d1.name,"hurong");    printf("%s\n",d1.name);    return 0;}int maina() {//    struct nameinfo myinfo =  { //这里时结构题初始化的第一种方式,非常的简单,这个必须要学会//        "baixiaoshi",//        "121312121",//        200//    };    //printf("name=%s\nphone=%s\n",myinfo.name,myinfo.phone);return 0;}
结构体的嵌套
#include <stdio.h>#include <stdlib.h>#include <string.h>struct baseinfo{    char name[50];    char addr[50];    int age;}; //基本信息struct extend_info{    char hobby[30];    char lovegirl[40];    struct baseinfo base;}; //拓展信息的结构题int main(){    //我们需要搞定一个什么样的问题呢,我们需要搞定一个结构题嵌套后如何赋值的问题    struct extend_info e1;    strcpy(e1.hobby,"my hobby");    strcpy(e1.lovegirl,"hu rong");    strcpy(e1.base.name,"baixiaoshi");    strcpy(e1.base.addr,"江西省贵溪市塘湾镇上祝村");    printf("%s \n",e1.base.addr);    return 0;}

struct node //字节对齐已经时一个老生长谈的问题了,原理:结构体中的每一个成员变量的字节数都要时最宽那个成员的倍数{    char ch;//4    int num;//4    char str[10]; //12};struct node{   //这里的最宽成员就是double 占8个字节    char ch;    8    short num;  8    double age; 8    char str[10];16};


0 0