0.说在前面1.i++与++i总结1.1 i++与++i1.2 区别总结:2.大小写转化3.交换字符串3.1 使用传字符串地址3.2 使用strcpy函数3.3 自写字符串交换函数3.4 同3.3自写函数4.字符串中单词4.1 统计字符串中单词个数4.2 最长单词及位置5.字符串与整数5.1 把字符串分别转换成面值相同的整数5.2 产生[m,n]范围内的随机数num6.复制字符串6.1 主函数6.2 五种方法复制字符串6.3 最简单方法7.删除*号7.1 删除除了尾部之外的其余*号7.2 只删除前面*号8.约瑟夫环9.文件16.1 求文件字节数16.2 读取文件中的数据10.汉诺塔问题11.三天打鱼两天晒网12.猴子分桃问题12.1 递归实现12.2 正向求解12.3 逆向求解13.斐波那契数列13.1 递归实现13.2 非递归实现14.特殊数14.1 用穷举法求某数段的素数14.2 水仙花数14.3 完全平方数14.4 完数14.5 同构数15.最小公倍数与最大公约数16.验证哥德巴赫猜想17.求近似数17.1 牛顿迭代法17.2 精简版17.3 二分法17.4 弦截法18.矩阵运算及二维数组18.1 求两个矩阵之和、之积18.2 二维数组19.位运算及应用19.1 位运算19.2 一个字节中被置为1的位的个数20.排序算法20.1 快速排序20.2 冒泡排序20.3 选择排序20.4 直接插入排序21.链表21.1 单链表之增删改查21.2 头插法21.3 链表逆置22.栈及栈应用22.1 入栈出栈及判空实现22.2 栈实现括号匹配23. 二叉树23.1 二叉树所有操作24.必会小点24.1 四舍五入24.2 逗号表达式24.3 void 类型指针24.4 内存分配24.5 质数分解24.6 大小写转化24.7 字符数字转化为整型数字25.常考小点25.1 完数25.2 闰年25.3 统计输入的数是几位数25.4 注意事项25.5 字符串比较25.6 转二进制25.7 文件指针25.8 sizeof与strlen25.9 转义符25.10 数字正反序25.11 求最后三位25.12 一维与二维数组对比25.13 优先级
0.说在前面
这是一篇8542字的长长长长…文,我知道你不会看完,没关系,先收藏,在转发,哈哈,觉得不错,可以帮我转发。
由于篇幅太长,所以只能分三篇发~~
1.i++与++i总结
1.1 i++与++i
下面注释的都可以使用,开启依次尝试!
#include<stdio.h>
int main()
{
int i = 0;
int a;
// i++;
// printf("%d\n",i); //i=1---i=i;i=i+1;
// ++i;
// printf("%d\n", i); //i=1---i=i+1;i=i;
// a = i++;
// printf("%d\n", a); //a=0 ---a=i;i=i+1;
// a = ++i;
// printf("%d\n", a); //a=1 ---i=i+1;a=i;
// a=i+i++;
// printf("%d\n", a); //a=0 ---a=i+i;i=i+1;
// a = i + ++i;
// printf("%d\n", a); //i=i+i->i=1->a=i+i;->a=2
// a = i + ++i + ++i;
// printf("%d\n", a);//i=i+1->i=1->i=i+1->i=2->a=i+i+i;a->6
// a = i + ++i + i++;
// printf("%d\n", a);//i++->最后进行加1,++i,此时加1,i=1->a=i+i+i;a=3;->i++中i操作,i=i+1
// i = i + ++i + i++;
// printf("%d\n",i);//i=4
// a = i + (i++) + (i++);
// printf("%d\n", a); //a=i+i+i;->i=i+1->i=1;->i=i+i->i=2;
// i = i + (i++) + (i++);
// printf("%d\n", i); //i=2
return 0;
}
1.2 区别总结:
i++ 返回原来的值,++i 返回加1后的值。
左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。
int i=0;
int *p1=&(++i); //True
int *p2 = &(i++); //False
++i=1; //True
i++=5; //False
2.大小写转化
#include<ctype.h>
toupper()/tolower()
例:str[i]=toupper(str[i]);
str[i]=tolower(str[i]);
3.交换字符串
3.1 使用传字符串地址
strSwap(&str1,&str2);
void strSwap(char **pa,char **pb)
{
char *temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
3.2 使用strcpy函数
strswap(str1,str2);
void strswap(char *pa, char *pb)
{
char temp[100];
strcpy(temp, pa);
strcpy(pa, pb);
strcpy(pb, temp);
}
3.3 自写字符串交换函数
strswap(str1,str2);
void strswap(char *pa,char *pb)
{
char temp[100];
int i;
for(i=0;pa[i]!='\0';i++)
temp[i]=pa[i];
temp[i]='\0';
for(i=0;pb[i]!='\0';i++)
pa[i]=pb[i];
pa[i]='\0';
for(i=0;temp[i]!='\0';i++)
pb[i]=temp[i];
pb[i]='\0';
}
3.4 同3.3自写函数
strcp(char *p1, char *p2)
{
while((*p1=*p2)!='\0')
{
p1++;
p2++;
}
p1='\0';
}
void strswap(char *pa,char *pb)
{
char temp[100];
strcp(temp,pa);
strcp(pa,pb);
strcp(pb,temp);
}
4.字符串中单词
4.1 统计字符串中单词个数
其中包含实现了对单词中第一个字符大写
int upfst(char *p)
{
int cong = 0; //判断前一字符是否为空格标志
int count = 0; //统计单词个数
//for (;*p;p++)
while(*p)
{
if (cong) //前一字符不为空格
{
if (*p == ' ')
cong = 0;
}
else //前一字符是空格操作
{
if (*p != ' ')
{
cong = 1;
*p = toupper(*p); //#include<ctype.h>
// *p = *p - 32; //转大写
count++;
}
}
p++;
}
return count;
}
4.2 最长单词及位置
输出一行字符串中的最长单词及其位置
//输出一行字符串中的最长单词及其位置
#include<stdio.h>
int main()
{
int word_length = 0, word_max=0;
printf("请输入一个字符串:");
char s[20];
gets_s(s);
int i,p;//这个p是用来记录最长单词的位置
for (i = 0; s[i] != '\0'; i++)
{
if (s[i] == ' ')//扫到空格,则结算是否为最长的单词
{
if (word_length > word_max)
{
word_max = word_length;
p = i;
}
word_length = 0;
}
else//如果i扫到的不是空格,那么开始计算单词的长度
word_length++;
}
if (word_length > word_max)//此乃用于最长的单词在结尾的情况
{
word_max = word_length;
p = i;
}
printf("最长单词的位置:%d\n",p-word_max+1);
char longest[100];
for (p = p - word_max, i = 0; word_max > 0; word_max--,p++, i++)
longest[i] = s[p];
longest[i] = '\0';
printf("The longest word is %s\n", longest);
return 0;
}
5.字符串与整数
5.1 把字符串分别转换成面值相同的整数
long d = 0;
while (*s)
if (isdigit(*s))
{
d = d * 10 + *s - '0';
//或d = d * 10 + *s - 48;
s++;
}
5.2 产生[m,n]范围内的随机数num
int num=rand()%(n-m+1)+m;
6.复制字符串
6.1 主函数
#include<stdio.h>
#include<string.h>
int main()
{
char *Mystrcpy(char *s1, char *s2);
void print(char *s1);
char a[] = "adad";
char b[20],*s;
/*未封装函数*/
char *p1, *p2;
/*p1 = a;
p2 = b;*/
while (*p1 != '\0')
{
*p2 = *p1;
p1++;
p2++;
}
int i;
*p2 = '\0';
for (i = 0; b[i] != '\0'; i++)
{
printf("%c",b[i]);
}
printf("\n");
return 0;
/*封装函数后调用*/
s=Mystrcpy(b,a);
print(s);
}
6.2 五种方法复制字符串
/*复制字符串*/
/*方法一*/
char *Mystrcpy(char *s1,char *s2)
{
char *p1, *p2;
p1 = s1; p2 = s2;
/*方法一*/
/*while (*p2 != '\0')
{
*p1 = *p2;
p1++;
p2++;
}
*p1 = '\0';*/
/*方法二*/
//while (*p1++=*p2++);
/*方法三*/
//方法三实际上等价于方法二
//注意此处"="只有一个,为赋值运算并非等于运算
/*while (*p1=*p2)
{
p1++;
p2++;
}
*/
//方法四
/*
'\0'字符串对应的ASCII为0,当p2所指向的字符为'\0'时,此时退出循环,未将结束字符串标记赋值给p1所指向的字符串。故在最后加上*p1='\0'/
*/
do
{
*p1++ = *p2++;
} while (*p2);
*p1 = '\0';
/*
方法五
方法四等同于方法五
*/
while (*p2)
{
*p1++ = *p2++;
}
*p1 = '\0';
return s1;
}
void print(char *s1)
{
int i;
for (i = 0; s1[i] != '\0'; i++)
{
printf("%c", s1[i]);
}
printf("\n");
}
6.3 最简单方法
/*复制字符串最简单方法*/
#include<stdio.h>
#include<string.h>
int main()
{
char s1[] = "asda";
char s2[20];
strcpy(s2,s1);
printf("%s",s2);
}
7.删除*号
7.1 删除除了尾部之外的其余*号
void fun(char *a, char *p)
{
char *t = a;
//先把字符串中非*字符存储,此时指针刚好指到最后一个字母的下一个字符(此时为*)
for (; t <= p; t++)
if (*t != '*')
*(a++) = *t;
//若当前字符串未扫描完,继续将其余所有的*存储,就实现了删除尾部之外的其余*号
for (; *t != '\0'; t++)
*(a++) = *t;
*a = '\0';
}
7.2 只删除前面*号
char *p = a;
while (*p == '*')
p++;
for (; *p != '\0'; p++, a++)
*a = *p;
*a = '\0';
或者
char *p = a;
while (*p++ == '*')
p++;
strcpy(a,p)
8.约瑟夫环
#include<stdio.h>
int main()
{
int out_person = 0;
int n,m,k;
printf("请输入人数:");
scanf("%d",&n);
printf("请输入逢几退一:");
scanf("%d", &m);
int i;
int a[100];
for (i = 0; i < n; i++)
a[i] = i+1;
i = 0;
while (out_person < n - 1)
{
if (a[i] != 0)
{
k++;
}
if (k == m)
{
a[i] = 0;
out_person++;
k = 0;
}
i++;
if (i == n)
i = 0;
}
int *p = a;
while (*p == 0)
p++;
printf("The last one is %d\n",*p);
return 0;
}
9.文件
16.1 求文件字节数
先fseek到末尾再用ftell得出当前位置,即为总文件字节数
fseek(fp,0l,SEEK_END);
int filesize=ftell(fp);
16.2 读取文件中的数据
//读取文件中的数据
#include<stdio.h>
#include<malloc.h>
int main()
{
FILE *fp;
char *p;
fp = fopen("d:\\file.txt","r");
fseek(fp,0l,SEEK_END);
long filesize = ftell(fp);
rewind(fp);或者fseek(fp,0l,SEEk_SET);
p = (char *)malloc(filesize+1);
fread(p,1,filesize,fp);
p[filesize] = 0;
puts(p);
free(p);
fclose(fp);
return 0;
}
10.汉诺塔问题
#include<stdio.h>
int main()
{
void move(int n, char pre, char mid, char end);
int n;
printf("请输入要移动的块数:");
scanf("%d",&n);
move(n,'a','b','c');
}
void move(int n,char pre,char mid,char end)
{
if (n == 1)
printf("%c->%c\n",pre,end);
else
{
move(n - 1, pre, end, mid);
move(1,pre,mid,end);
move(n-1,mid,pre,end);
}
}
11.三天打鱼两天晒网
#include<stdio.h>
int main()
{
int year, month, day;
int syear, smonth;
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("Please input year.month.date:\n");
scanf("%d,%d,%d",&year,&month,&day);
int i,m;
syear = 0;
m = 365;
for (i = 1990; i < year; i++)
{
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
syear = m + 1;
else
syear = m;
}
smonth = 0;
int k;
//最后一年前几个月天数
for (i = 1; i < month; i++)
{
smonth += a[i];
}
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
if (month > 2)
{
smonth += 1;
}
i = syear + smonth + day;
k = i % 5;
if (k==1||k==2||k==3)
printf("今天打渔!\n");
else
printf("今天晒网!\n");
return 0;
}
12.猴子分桃问题
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,
12.1 递归实现
//递归
#include<stdio.h>
int divided(int n, int m)
{
//不足5个或不能分5份多1个,分配失败
if (n / 5 == 0 || n % 5 != 1)
return 0;
//分到最后一个猴子,说明能分配成功
if (m == 1)
return 1;
return divided(n-n/5-1,m-1);
}
int main()
{
int n;
int m = 5;
for (n = 1;; n++)
{
if (divided(n, m))
{
printf("%d\n",n);
break;
}
}
return 0;
}
12.2 正向求解
//猴子分桃问题
#include<stdio.h>
int main()
{
int i,num,k;
for (i = 6;; i += 5) //对所有能分成5份的进行试探
{
num = i;
//5个猴子做同样分挑操作
for (k = 0; k < 5; k++)
{
if (num / 5 == 0 || num % 5 != 1)
break; /*如果剩余的桃子分不成5份或者分成5份后不会正好多余1个桃子,则说明分桃过程进行不下去了,结束分桃*/
num = num - num / 5 - 1; /* 如果分桃过程能进行下去,拿走一份,扔掉1个,下一个猴子继续分桃*/
}
if (k >= 5)
{
break;/*如果上面的循环顺利结束,说明分桃顺利结束,找到了符合条件的最小桃子数,返回*/
}
}
printf("最少桃树为:%d\n",i);
}
12.3 逆向求解
/*还有一种逆向求解的方法,探试的次数要少一点*/
#include<stdio.h>
int MinNum()
{
int i, j, num;
for (i = 6;; i += 5)
{
num = i;
for (j = 5; j > 1; j--)
{
if (num % 4)
break;
num = num + num / 4 + 1;
}
if (j <= 1)
return num;
}
}
int main()
{
printf("最少桃子数为:%d\n", MinNum());
return 0;
}
13.斐波那契数列
13.1 递归实现
int fib1(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fib1(n-1)+fib1(n-2);
}
13.2 非递归实现
int fib2(int n)
{
int f1, f2, f3;
f1 = 1;
f2 = 1;
f3 = 0;
if (n == 1 || n == 2)
f3=1;
else
{
while (n > 2)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
n--;
}
}
return f3;
}
14.特殊数
14.1 用穷举法求某数段的素数
#include<stdio.h>
int main()
{
int i, j;
int m, n;
int flag,count=0;
printf("请输入上下界:\n");
scanf("%d%d",&m,&n);
for (i = m; i <= n; i++)
{
flag = 1;
if (i == 1)
{
flag = 0;
continue;
}
for (j = 2; j < i; j++)
{
if (i%j == 0)
{
flag = 0;
break;
}
}
if (flag)
{
printf("%d是素数!\n",i);
count++;
}
}
printf("共%d个素数!\n",count);
return 0;
}
14.2 水仙花数
所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身
#include<stdio.h>
int main()
{
int a, b, c;
int i,count=0;
for (i = 100; i < 1000; i++)
{
a = i / 100;
b = i % 100 / 10;
c = i % 100 % 10;
if (i == (a*a*a + b*b*b + c*c*c))
{
printf("a=%d,b=%d,c=%d\n", a, b, c);
printf("%d是水仙花数.\n",i);
count++;
}
}
printf("共%d个水仙花数\n",count);
return 0;
}
14.3 完全平方数
#include<stdio.h>
#include<math.h>
int main()
{
int n;
printf("请输入一个整数:\n");
scanf("%d",&n);
//注意sqrt函数原型 ---- double sqrt(double x);
if (sqrt(n) == (int)sqrt(n))
{
printf("%d是完全平方数.\n", n);
printf("%d=%d*%d\n", n, (int)sqrt(n), (int)sqrt(n));
}
else
printf("%d不是完全平方数.\n", n);
return 0;
}
14.4 完数
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数.
#include<stdio.h>
int main()
{
int i, sum, j, count=0, k;
int m;
int a[100];
for (i = 1; i <= 1000; i++)
{
sum = i;
k = 0;
for (j = 1; j < i; j++)
{
if (i%j == 0)
{
sum -= j;
a[k++] = j;
}
}
if (sum == 0)
{
printf("\n%d是完数!\n", i);
printf("其因子是:");
for (m = 0; m < k; m++)
printf("%d ",a[m]);
count++;
}
}
printf("\n共%d个完数!\n",count);
return 0;
}
14.5 同构数
同构数之解法一
正整数n若是它平方数的尾部,则称n为同构数
#include<stdio.h>
int main()
{
int i;
for (i = 1; i < 100; i++)
{
int pow = i*i;
int a;
if (i < 10)
{
a = pow % 10;
if (i == a)
{
printf("%d是%d的同构数.\n",i,pow);
}
}
else if (i >= 10&i<100)
{
a = pow % 100;
if (i == a)
{
printf("%d是%d的同构数.\n", i, pow);
}
}
}
return 0;
}
同构数之解法二
#include"stdio.h"
int isomorphism(int i)
{
int mod;
if (i<10)
mod = 10;
else
mod = 100;
if (i == i*i%mod)
return 1;
return 0; //不是,则要明确返回0
}
void main()
{
int i;
printf("1~100之间的同构数有:\n");
for (i = 1; i<100; i++)
{
if (isomorphism(i) == 1)
printf("%4d", i);
}
printf("\n");
}
同构数之解法三
//判断是不是同构数函数
int fun(int n)
{
int a, b;
int m = n*n;
while (n)
{
a = n % 10, b = m % 10;
if (a != b)
break;
n /= 10;
m /= 10;
}
if (n)
return 0;
return 1;
}
15.最小公倍数与最大公约数
void fun(int m ,int n)
{
int r, rx;
rx = m*n;
while (n)
{
r = m%n;
m = n;
n = r;
}
printf("最大公约数为:%d\n",m);
printf("最小公倍数为:%d\n",rx/m);
}
16.验证哥德巴赫猜想
哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。输入两个整数m,n(6小于等于m,m小于等于n,n小于等100),将m,n之间的偶数表示成两个素数之和
#include<stdio.h>
#include<math.h>
int main()
{
int isPrime(int n);
int n, m;
printf("请输入m和n:");
scanf("m=%d,n=%d",&m,&n);
int i,j,count=0;
if (m > 6)
{
for (i = m; i <= n; i++)
{
if (i % 2 == 0)
{
//注意此处为就j<=i/2
for (j = 2; j <= i / 2; j++)
{
if (isPrime(j) && isPrime(i - j))
{
printf("%d=%d+%d\n",i,j,i-j);
count ++;
break;
}
}
}
}
}
printf("%d到%d之间共有%d个哥德数.\n",m,n,count);
return 0;
}
int isPrime(int n)
{
int i,flag=1;
for (i = 2; i < sqrt(n); i++)
{
if (n == 2)
return flag;
else
{
if (n%i == 0)
{
flag = 0;
break;
}
}
}
}