• 算法入门笔记------------Day1


    1.C语言使用%d显示float值,不会把float值转换为近似的int值,而是显示垃圾值,使用%f显示int值,也不会把该int值转换为浮点值

    2.三位数反转:输入一个三位数,分离它的百位,十位和个位,反转后输出

    #include<stdio.h>
    int main(void)
    {
            int a;
            scanf("%d",&a);
            printf("%d %d %d
    ",a%10,a/10%10,a/100);
            return 0;
    }
    
    //考虑250的情况,是够需要输出52还是052
    #include<stdio.h>
    int main(void)
    {
            int a;
            scanf("%d",&a);
            a=a%10*100+a/10%10*10+a/100;
            printf("%03d
    ",a);
            return 0;
    }
    

    3.两数交换

    //变量交换
    #include<stdio.h>
    int main(void)
    {
            int t,a,b;
            scanf("%d%d",&a,&b);
            t=a;
            a=b;
            b=t;
            printf("%d %d",a,b);
            return 0;
    }
     
    //两变量方法
    #include<stdio.h>
    int main(void)
    {
            int a,b;
            scanf("%d%d",&a,&b);
            a=a+b;
            b=a-b;
            a=a-b;
            printf("%d %d
    "a,b);
    }
    
    //异或思想,慎用
    #define swap(a,b) a^=b^=a^=b
    注意这里的运用,对于同一变量的两次修改不能放在一个表达式里,
    #include <stdio.h>
    #define swap(a,b) a^=b^=a^=b
    int main(void)
    {
    	int a=1,b=2;
    	int c[]={1,2};
    	swap(a,b);
    	swap(c[0],c[1]);
    	printf("a=%d,b=%d
    ",a,b);
    	printf("c[0]=%d,c[1]=%d
    ",c[0],c[1]);
    	return 0;
    }
    
    在GCC下运行结果:
    a=2,b=1
    c[0]=0,c[1]=1
    在VC6.0环境下运行结果:
    a=2,b=1
    c[0]=2,c[1]=1

    4三整数

    #include<stdio.h>
    int main(void)
    {
            int a,b,c,t;
            scanf("%d%d%d",&a,&b,&c);
            if(a>b)  {
                t=a;a=b;b=t;
            }
            if(a>c){
                t=a;a=c;c=t;
            }
            if(b>c){
                t=b;b=c;c=t;
            }
            //从小到大排列
            printf("%d %d %d
    ",a,b,c);
            return 0;
    }
    //注意这里如果是先a,b,再比较b,c,最后a,c,这里可能发生的是中间值被二次修改
    
    #include<stdio.h>
    int main(void)
    {
            int a,b,c,x,y,z;
            scanf("%d%d%d",&a,&b,&c);
            x=a;if(b<x)  x=b;if(c<x)  x=c;
            z=a;if(b>z)   z=b;if(c>z)   z=c;
            y=a+b+c-x-z;
            printf("%d %d %d
    ",x,y,z);
            return 0;
    }
    

    5.C语言中三角函数使用弧度而不是角度

    6.闰年的判断

    if(year%4==0&&year%100!=0)||(year%400==0)
      return 1;
    else
      return 0;

    7.输出形如aabb的四位完全平方数

    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
            int a,b,s;
            for(a=1;a<=9;a++)
              for(b=0;b<=9;b++)
                {
                        s=1100*a+11*b;
                        if(floor(sqrt(s)+0.5)==sqrt(s))   //floor是返回x的整数部分,为了减小误差采用四舍五入 floor(x+0.5)
                            printf("%d
    ",s);
                }
            return 0;
    }
    
    
    #include<stdio.h>
    int main(void)
    {
            int x,n,hi,ho;
            for(x=1;;x++)
            {
                n=x*x;
                if(n<1000)  continue;
                if(n>9999)  break;
                hi=n/100;
                ho=n%100;
                if(hi/10==hi%10&&ho/10==ho%10)   printf("%d
    ",n);
            }
            return 0;
    }
    

    8.3n+1问题

    #include<stdio.h>
    int main(void)
    {
            int n,num=0;
            scanf("%d",&n);
            while(n>1)
            {
                if(n%2==1)      n=3*n+1;  //大数据,乘法可能溢出
                else        n=n/2;
                num++;
            }
            printf("%d
    ",num);
            return 0;
    }
    
    //当输出987654321的时候出现错误,原来是乘法溢出了
    //为了解决这个问题,有个好点的方法可以解决,就是当n为奇数的时候,3n+1一定是偶数,这时候立刻除以2,也就是(3n+1)/2=(2n+n+1)/2=n+(n+1)/2;
    #include<stdio.h>
    int main(void)
    {
            int n,num=0;
            scanf("%d",&n);
            while(n>1)
            {
                if(n%2==1)      {
                    n=n+(n+1)/2;    //修改这里
                    num++;
                }
                else        n=n/2;
                num++;
            }
            printf("%d
    ",num);
            return 0;
    }
    

    9.阶乘之和

    #include<stdio.h>
    int main(void)
    {
            int i,j,n;
            int s=0;
            scanf("%d",&n);
            for(i=1;i<=n;i++)
            {
                    int fac=1;
                    for(j=1;j<=i;j++)
                        fac*=j;
                    s+=fac;
            }
            printf("%d
    ",s%1000000);
            return 0;
    }
    
    
    //这里可能会溢出,因为阶乘数据很大
    所以采用对每一步进行对n取余,结果不变,这是一个数论的知识点
    #include<stdio.h>
    #include<time.h>
    int main(void)
    {
            int i,j,n;
            int s=0;
            const int MOD=1000000;
            scanf("%d",&n);
            for(i=1;i<=n;i++)
            {
                    int fac=1;
                    for(j=1;j<=i;j++)
                        fac=(fac*j%MOD);
                   s=(s+fac)%MOD;
            }
            printf("%d
    ",s);
            printf("Time used=%.2lf
    ",(double)clock()/CLOCKS_PER_SEC);  //学习一下time头文件的用法
            return 0;
    }
    

    10.文件操作

    #define LOCAL
    #include<stdio.h>
    #define INF 1000000000
    int main(void)
    {
            #ifdef LOCAL
                freopen("data.in","r",stdin);
                freopen("data.out","w",stdout);
            #endif // LOCAL;
            int x=0,n,min=INF,max=-INF,s=0;
            while(scanf("%d",&n)==1)
            {
                    if(n>max)   max=n;
                    if(n<min)    min=n;
                    s+=n;
                    x++;
            }
            printf("%d %d %.3lf
    ",min,max,(double)s/x);
            return 0;
    }
    
    //文件输入输出操作,不使用重定向的方式
    #include<stdio.h>
    #define INF 10000000
    int main(void)
    {
            FILE  *fin,*fout;
            fin=fopen("data.in","rb");
            fout=fopen("data.out","wb");
            int x=0,n,s=0,min=INF,max=-INF;
            while(fscanf(fin,"%d",&n)==1)
            {
                if(n>max)  max=n;
                if(n<min)  min=n;
                s+=n;
                x++;
            }
            fprintf(fout,"%d %d %.3lf
    ",min,max,(double)s/x);
            fclose(fin);
            fclose(fout);
            return 0;
    }
    

    习题 

    //输入一个不超过10的9次方的整数,输出它的位数
    #include<stdio.h>
    int main(void)
    {
            int n;
            scanf("%d",&n);
            int num=1;
            while(n>9)
            {
                    n=n/10;
                    num++;
            }
            printf("%d
    ",num);
    
    }
    
    
    //水仙花数
    #include<stdio.h>
    int main(void)
    {
            int a,b,c;
            for(int i=100;i<=999;i++)
            {
                a=i/100;
                b=i/10%10;
                c=i%10;
                if(a*a*a+b*b*b+c*c*c==i)
                    printf("%d
    ",i);
            }
            return 0;
    }
    
    
    //韩信点兵
    #include<stdio.h>
    int main(void)
    {
            int a,b,c,i;
            scanf("%d%d%d",&a,&b,&c);
            for(i=10;i<=100;i++)
            {
                    if(i%3==a&&i%5==b&&i%7==c)
                    {
                        printf("%d
    ",i);  break;
                    }
                    else      continue;
            }
            if(i>100)   printf("No answer
    ");
            return 0;
    }
    
    
    //倒三角
    #include<stdio.h>
    int main(void)
    {
            int n;
            scanf("%d",&n);
            for(int i=n;i>=1;i--)
            {
                    for(int j=1;j<=2*i-1;j++)
                            printf("#");
                    printf("
    ");
                    for(int k=n;k>=i;k--)
                            printf(" ");
            }
            return 0;
    }
    
    //分数化小数
    #include<stdio.h>
    int main(void)
    {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            printf("%.*lf
    ",c,(double)a/b);
            return 0;
    }
    
    //近似计算,有点问题
    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
            int t=-1;
            double a=1.0,sum=1.0;
            while(fabs(a)>=0.01)
            {
                    a=(1.0)/(a+2);
                    a=a*t;
                    sum=sum+a;
                    t=t*-1;
            }
            printf("%.9lf
    ",sum);
            return 0;
    }
    

      

  • 相关阅读:
    call me
    互相关注请留言!我也会及时关注你的哦!
    tomcat单机多实例
    powerdesigner导出rtf
    IDEA快捷键
    SQLyog Enterprise Trial 试用期问题
    ubuntu 16.04 忘记root密码
    使用Xshell连接ubuntu
    观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
    jvm方法栈
  • 原文地址:https://www.cnblogs.com/SqLver/p/4928672.html
Copyright © 2020-2023  润新知