算法入门笔记------------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;
}

  

原文地址:https://www.cnblogs.com/SqLver/p/4928672.html