C语言入门学习笔记
动态和静态储存方式 递归函数 内部函数与外部函数 数据类型 矩阵 N!末尾0数 杨辉三角 田忌赛马 怎么存钱问题 TOM数 母牛生小牛 进制转换 平分7筐鱼 二分查找 筛素数
动态和静态储存方式
static int x = 1;
定义一个静态储存方式的x 这种变量在被函数调用之后x的值会被保存
auto int x = 1
定义一个动态储存方式的x 这种变量在被函数调用期间值会变化,但是调用结束之后会回到1的值 auto可以省略
例:
void an()
{
int c = 0; // 定义动态储存方式结果就是1 1 1 1
c++; // 如果是static int 结果就是 1 2 3 4
printf("%d\n", c);
}
int main()
{
int i = 4;
for(i; i >= 0;i--)
{
an();
}
return 0;
}
递归函数
int an(int x)
{
int c;
if(x==1)
{
return 1;
}
else
return an(x-1)*x;//当运行到an(1)的时候 an(1)的值来自return 1;1x2x3x4x5=120
所以如果是return 0的话 就是 0x2x3x4x5 = 0
}
int main()
{
int a = 5;
printf("%d\n", an(a));
return 0;
}
内部函数与外部函数
#include <stdio.h>
#include "test.c"= //引用test.c文件
static void printLine() //这里定义的方法对吗?
{
printf("**************\n");
}
int main()
{
say();
return 0;//void say()是外部函数 不需要include "text.c"的引用
}say()中有引用printLine() 所以要删掉static, (定义的)
C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。
test.c:
#include <stdio.h>
void say(){
printLine();
printf("I love imooc\n");
printf("good good study!\n");
printf("day day up!\n");
printLine();
}
数据类型
如果scanf("%d%d%c", &a, &b, &c); 输入1 2 c 结果将为1 2 (空格),c前面的空格被录入,可以在第二个%d 后面加一个空格或者在%d%d%c之间换成加个间隔符.
int a = 3, b = 4; (a+b)/3.0结果为3.50000.
pow()返回的是double类型.
矩阵
求矩阵对角线之和 矩阵位NxN的话 看看i+j == N 和 i == j.
N!末尾0数
你只要知道有1个5的倍数末尾就多1个0,25多2个,125多3个…
int sum=0,n
scanf("%d", &n);
while(n)
{
sum += n/5; //算出有多少个5的倍数
n /= n; // 当执行这一步后 再执行sum += n/5 其实就是算的25的倍数的个数了。依次的125 625......
}
杨辉三角
int n,i,j,k
scanf("%d", &n);
for(i=1;i<=n;i++){ //控制行数
for(k=1;k<=n-i;k++){ //控制每行前面的空格
printf(" ");
}
for(j=1;j<=i;j++){ //控制每行里的数字
printf("%d ", c(i,j));}
printf("\n");
}
int c(int x, int y){ //输出的数字算法
int z;
if(x== 1||x== 2||y== 1|| x== y)
z=1;
else
z=c(x-1,y-1)+c(x-1,y)
return z;
}
田忌赛马
将敌b[ ]我a[ ]双方的马按照从小到大排序后,按顺序进行速度比较
for(i=0;i<n;i++)
{
if(a[i]>b[j])
{
win++; j++;
} //赢了后 继续比下一组 并且胜利次数+1
else { lose++;} //如果输了 b[j]不变 把一下a[i]继续和上一个b[j]比较
}
if(win>n/2||lose>n/2) break; //当赢或者输的次数过一半时就结束循环
if(win>n/2) printf("YES");
else printf("NO");
怎么存钱问题
for(i8=0;i8<3;i8++) //穷举所有可能的存款方式
for(i5=0;i5<= (20-8*i8)/5 ; i5++) //注意每一步后面的/5 /3 /2 因为存钱必须存满规定时间,如8年,5年才能取出
for(i3=0;i3<= (20-8*i8-5*i5)/3 ; i3++)// 拿存3年来说 如果剩下的年限小于3年 如果2年,2/3=0,所以3寸3年的情况
for(i2=0;i2<= (20-8*i8-5*i5-3*i3)/2 ; i2++)//就不满足,就只能判断存2年的情况。
{
i1=20-8*i8-5*i5-3*i3-2*i2;
sum = 2000.0*pow((double)(1+0.0063*12),(double)i1)
*pow((double)(1+2*0.0063*12),(double)i2)
*pow((double)(1+3*0.0069*12),(double)i3)
*pow((double)(1+5*0.0075*12),(double)i5)
*pow((double)(1+8*0.0084*12),(double)i8);//
if(sum>max){
max = sum;
y1=i1;y2=i2;y3=i3;y5=i5;y8=i8;
}
}
TOM数
定义字符数组来储存整数,将整数看成一个字符串.for(i=0;str[i]!='\0';i++)
{
sum += str[i]-'0'; // 一个整数的ASC码值减去0的ASC码值 刚好等于这个整数 字符2是50 字符0是
48 , 50 - 48 = 2;
}
母牛生小牛
定义c1,c2,c3,c4 分别储存4个年龄段的牛的数量 1岁 2岁 3岁 4岁及以上
int c1=0,c2=0,c3=1,c4=0;
if(n>=1&&n<=3)
printf("1");
else if(n>3){
for(i=4;i<=n;i++){
c4=c3+c4; //第4年 第一只牛成4岁了 生了一只牛 这只牛算第1年 然后循环.
c3=c2;
c2=c1;
c1=c4;
}
sum = c1+c2+c3+c4;
printf("%d", sum);
}
进制转换
10转换成2进制的函数void res(int n)
{
if(n!=0)
{
res(n/2);
printf("%d",n%2);
}
}
平分7筐鱼
算下来每个人有3.5筐鱼和7个筐。 定义数组a[3][3] 3行对应3人,3竖对应 满筐鱼 半筐鱼 空筐的数量。 for(i=0;i<=3;i++) //每个人满筐不超过3筐
{
a[0][0] = i;
for(j=0;j<=7-i&&j<=3;j++)
{
a[1][0] = j;
a[2][0]=7-i-j;
if(a[2][0]>3)continue; //如果最后一个人满筐于大于3筐就不符合。
if(a[2][0]<a[1][0]||a[1][0]<a[0][0])break;//用来排除重复结果
for(k=1;k<=5;k+=2)// k=1是因为每个人至少要有一个半框
{
a[0][1]=k;
for(l=1;l<=7-k;l+=2)
{
a[1][1]=l;
a[2][1]=7-k-l;
for(m=0;m<3;m++)
{
if(a[m][0]*2+a[m][1]==7) //为了方便 7是3.5筐鱼乘2的结果
{
b=1; //b=1是为了方便下面的语言进行判断,
a[m][2] = 7-a[m][0]-a[m][1];//最后算出空筐的数量
}
else
{
b=0;
break;
}
}
if(b==1)//最后判断b==1就输出结果
{
for(n=0;n<3;n++)
{
printf("%d %d %d\n", a[n][0],a[n][1],a[n][2]);
}
printf("\n");
二分查找
定义high low, 有m个元素,查找k
high = m-1;
low = 0
while(high >= low)
{
l = (high + low)/2 //二分
if(k > a[l]) low = l+1;
if(k< a[l]) high = l-1;
if(k==a[l])
{
printf("%d\n", l);
break;
}
if(hign < low)
{
printf("-1\n");
break;
}
}
筛素数
#define MAXN 100005
#define MAXL 1299710
int prime[MAXN];
int check[MAXL];
int tot = 0;
memset(check, 0, sizeof(check));
for (int i = 2; i < MAXL; ++i)
{
if (!check[i])
{
prime[tot++] = i;
}
for (int j = 0; j < tot; ++j)
{
if (i * prime[j] > MAXL)
{
break;
}
check[i*prime[j]] = 1;
if (i % prime[j] == 0)
{
break;
}
}