C语言学习记录代码墙
原创
©著作权归作者所有:来自51CTO博客作者墨墨依旧的原创作品,请联系作者获取转载授权,否则将追究法律责任
判断公因数 int retur(int x, int y) { while (x-y>0) { int z = x - y; x = y; y = z; }return x; } int main() { int a,b; printf("判断两个数的公因数"); scanf_s("%d%d", &a, &b); int ret=retur(a,b); printf("%d", ret); }
交换数组元素 void tihuan(char arr1[], char arr2[], size_t sz)// { size_t left = 0; size_t right = sz - 1;//定义size_t数据结构大小首选参数 while (left <= right) { arr1[left] = arr2[left]; arr1[right] = arr2[right];
printf("%s\n", arr1); Sleep(1000); system("cls"); left++; right--; } } int main() { char arr1[] = "##################"; char arr2[] = "welcome my world"; size_t sz = strlen(arr2);//进行传参时int转换为size_t时会造成参数丢失,所以定义为size_t tihuan(arr1, arr2, sz); } 判断素数 void xunhuan(int x) { int j=0; for(j=2;j<x;j++)//从2到他本身进行试除,又被除的就结束,因为素数只有1和他本身 {//若是2之前的开始就会导致判断错误,当x传过来想一下任何数抹除1或0结果都是0,无论你传什么都会结束执行,判断永远是j<x,永远为否 if (j % x == 0) break;
}if (j >= x) printf("%d是素数",x); else printf("%不是素数",x);
} int main() { int a; scanf_s("%d", &a); xunhuan(a); return 0; } 打印字符串 int main() { char arr1[] = "##################"; char arr2[] = "welcome my world"; int sz = strlen(arr2); int left = 0; int right = sz - 1; while (left <= right) { arr1[left] = arr2[left]; arr1[right] = arr2[right]; printf("%s\n", arr1); Sleep(1000); system("cls"); left++; right--; } } 大小值排序 void retur(int x, int y,int z) { if (x <y)//如x小于y就进行替换 { int tmp = y; y = x; x = tmp; } if (x < z)//替换完毕后,再试一下是否是三个数中最大的值,如果不是就和z进行替换 {+ int tmp = z; z = x; x = tmp; } if (y < z)//再用已经替换了的y和z进行比较看看被替换的y和z的值谁是最小的 { int tmp = z; z = y; y = tmp; } printf("%d %d %d", x, y, z); }
int main() { int a,b, c; printf("判断两个数"); scanf_s("%d%d%d", &a, &b,&c); retur(a,b,c);
}
|
|
|
一个书写有问题,但是结果主观正确 int main() { int a; char arr1[9] = {1,2,3,4,5,6,7,8,9}; int sz = sizeof(arr1)/sizeof(arr1[0]);//进行传参时int转换为size_t时会造成参数丢失,所以定义为size_t //不能用strlen,他是字符串的,要把strlen和sizeof记清 scanf_s("%d", &a); int left = 0; int right = sz - 1; while (left <= right) { int pd = (right + left);//每一次缩小范围进行查找 if (arr1[pd] < a) { left += 1;//范围缩小 } else if (arr1[pd]> a) { right -= 1;//范围缩小 } else { printf("%d", pd); break;//要加入break,否则会进入死循环 } } }
| 二分查找法 int main() { int a; char arr1[9] = {1,2,3,4,5,6,7,8,9}; int sz = sizeof(arr1)/sizeof(arr1[0]);//进行传参时int转换为size_t时会造成参数丢失,所以定义为size_t //不能用strlen,他是字符串的,要把strlen和sizeof记清 scanf_s("%d", &a); int left = 0; int right = sz - 1; while (left <= right) { int pd = (right + left)/2;//每一次缩小范围进行查找 if (arr1[pd] < a) { left =pd+ 1;//范围缩小 } else if (arr1[pd]> a) { right = pd-1;//范围缩小 } else { printf("%d", pd); break;//要加入break,否则会进入死循环 } } }
|
|
这个书写有问题,但是最后的结果却是能实现我们的需求,但是里面的漏洞百出,所以平时编程时候一定要严谨,这样第一个if实际无意义,算法思路就是用最大的值减去要找的,然后一个一个减,直到数与要查找得数相等,再输出他的下标。 | 这个就是标准我们实现二分查找的思路,但是要注意好查找的数大于小于中间坐标时左右下标的控制。 |
查找数组中最大数 int main() { int arr[] = { 1,2,3,4,5,12,7,8,1 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); //int index = 0; int max = 0; // scanf_s("%d", &index); while (i <= sz) { if (max < arr[i]) { max = arr[i]; }i++; }printf("%d", max); }查找最大数 |
交换数组值 int main() { int arr[] = { 1,3,5,7 }; int arr2[] = { 2,4,6,8 }; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; int tmp = 0; for (i = 0; i <= sz; i++) { tmp = arr[i]; arr[i] = arr2[i]; arr2[i] = tmp; }//i运行完之后数值就变成了4
for (i = 0; i < sz; i++) { printf("%d", arr[i]); } }
|
|
|
| |
|
windows采用小端法,地址从低位向高位开始排,从a的地址中看出,a只是助记符,实际上就是一块地址 | 数组在地址空间中的排列是连续的,每一个字节都是按照小端法排列,地址开辟空间自高向下开辟,数组使用自低向下使用 |
int reound(int a) { int count = 0; while (a) { a = (a - 1) & a; count++; }return count; }
int main() { int a = 0; scanf_s("%d", &a); int ret = reound(a); printf("%d", ret); |
int reound(int a) { int i = 0; int count = 0; for (i = 0; i < 32; i++) { if (((a >> i) & 1) == 1) { count++; } }return count; } int main() { int a = 0; scanf_s("%d", &a); int ret = reound(a); printf("%d", ret); } |
int jiecheng(int a) { if (a == 0) return 1; return a* jiecheng(a - 1); }
int main() { int a; scanf_s("%d", &a); a = jiecheng(a); printf("%d", a); }
|
|
这一种思想是将每一位减1然后和他原位进行按位与,都为0的时候统计结束 例如8他的二进制为1000,减一后为0111;按位与后为0,执行一次,有一个一 | int四个字节32位,将这个数的二进制每个都和1进行按位与,按位与后后为1就能记录下这一位,统计加一。 | 递归实现阶乘 递归的两个条件1有一个结束条件,越来越接近这个结束条件 2,每一次递归实现都会越来越接近最后的值 |
内存越界
int zifu (char* a) { int count = 0; while (*a != '\0') { *a >> 1; count++; a++; }return count; }
int main() { char a [] = {0}; scanf_s("%s", a,20); int b = zifu(a); printf("%d", b); } |
int jie(char* n) { int count = 0; while (*n != '\0') { *n >> 1; count++; n++; }return count; }
int main() { char arr[] = "bitt"; int ret = jie(arr); printf("%d", ret); }
|
|
一个内存越界的情况 | 而这个并没有越界 |
百度面试题,什么是大端小端,用代码实现大端小端的方法
int pan()
{
int a = 1;
// char* pd = (char*)&a;
//返回1小端。返回0大端
//return* pd;
return *(char*)&a;//嘴贱书写方式
}
int main()
{
int ret=pan();
if (ret == 1)//返回1是小端,返回0是大端,地址从左到右是从低向高位次排,低位有数就是从低向高,就是小端
printf("xiao");
else
printf("da");
}
5100
char类型的存储长度是分为unsigned char和signed char的unsigned长度是0-255,unsigned的长度是-128-127
char a = 128; printf("%u", a); return 0;
|
char a = -128; printf("%u", a); return 0;
| 而实际的过程中假设a的值是-128,他在内存中是以补码形式存在的所以我们要将原码换成补码去解决问题-128原码为100000000 -127补码是10000001换成补码是11111111,这时候无法进1就变成了(1)10000000,实际上这个位就默认是128 |
|
运行下面这两段代码,会发现他们的值都是同一个
实际上128的原码补码反码相同是10000000,但是-128的源码是100000000,这是候他们的值就完美吻合了。
|
|
char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); return 0;
值为255,当执行完0到-128就会自动转换问0-127之间的值 |
unsigned int i;//无符号数始终>=0 for (i = 9; i >= 0; i--)//执行完之后,会陷入死循环,因为始终》=0 { printf("%u\n", i); Sleep(100);
值执行完9-0之后死循环,因为unsigned始终大于等于0 |
unsigned char i = 0; int main() for (i = 0; i <= 255; i++)//因为char的范围是0-255,所以一直向后加i的值始终是255,死循环 { printf("hello,world\n"); } return 0;
|
|
|