C的小算法集合

//我告诉自己,是时候好好弄一下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     else
9     {
10         return  get_item(item-1) + get_item(item-2);
11     }
12 }
13
14 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 10
int 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    10
11   12   13   14   15   16   17   18   19   20
21   22   23   24   25   26   27   28   29   30
31   32   33   34   35   36   37   38   39   40
41   42   43   44   45   46   47   48   49   50
51   52   53   54   55   56   57   58   59   60
61   62   63   64   65   66   67   68   69   70
71   72   73   74   75   76   77   78   79   80
81   82   83   84   85   86   87   88   89   90
91   92   93   94   95   96   97   98   99   100

1    0    0    0    0    0    0    0    0    0
0    12   0    0    0    0    0    0    0    0
0    0    23   0    0    0    0    0    0    0
0    0    0    34   0    0    0    0    0    0
0    0    0    0    45   0    0    0    0    0
0    0    0    0    0    56   0    0    0    0
0    0    0    0    0    0    67   0    0    0
0    0    0    0    0    0    0    78   0    0
0    0    0    0    0    0    0    0    89   0
0    0    0    0    0    0    0    0    0    100  

#include <stdio.h>
#include <stdlib.h>
#define I 2
#define J 3
int 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    3
3    4    5


1    3
2    4
3    5
3    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 nameinfo
struct 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值