笔记

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;
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值