关于C语言狗血的理解这是重点

原创

求1+2+……+n=?

给定一个n,其中n<=2^32;

明显超范围了的,用unsign long long int8X2X4(64)个位足够了,但是要先除2,再相乘,否则会超出64位。
#include

int main()

{

    unsigned long long int n;

    scanf("%lld",&n);

    unsigned long long  ans=0;

    if(n%2==0)

printf("%llu",(n/2)*(n+1));

else

printf("%llu",((n+1)/2)*n);

    return 0;

}

第一次实验:整数分割可以用求余,和求商的方法做。

想判断闰年的题不应该思考了,得有自己的套路了

判断闰年

#include

int main()

{

    int n;

    scanf("%d",&n);

    if(n%400==0)printf("Yes");

    else if(n%4==0&&n%100!=0)printf("Yes");

    else printf("No");

}

如果能整除400是闰年,如果能被4整除但不能被100整除是闰年,其他的不是闰年。

2的多少次方

#include

#include

int main()

{

    double x,y;

    scanf("%lf",&x);

    y=log2(x);

    printf("%g",y);//不输出多余的0

}

double可以存一个很大的数

IEEE-754存储机制

image

log函数log2

如果是读取一整行字符串肯定是用gets函数!!

(一旦有比较类的题就注意相等的情况)

第二次作业G题,以后逻辑判断全都用if判断做

循环模拟。

#include

int main()

{

    int k,m,n;

    int flag=0;

    scanf("%d %d %d",&k,&m,&n);

    int i;

    for(i=1;i<=k;i++)

    {

if();

else

{

if((i%m==0||i%n==0)&&!(i%m==0&&i%n==0))

        {

            if(flag)printf(" ");

        printf("%d",i);

        flag=1;

    }

    }

    }

    return 0;

}

注意&&优先级高于||的优先级,高一级。()是最高的优先级。

简单的保留两位小数的分数转小数。

#include

int main()

{

    int i,j;

    scanf("%d/%d",&i,&j);

    printf("%.2f",i*1.0/j);

return 0;

}
作业3 problem C错误原因:没看清题。

作业3 problem F错误原因:严格按照题意写程序,不要按照自己的理解写程序。

输出的所有数在两行“=====”之间。

作业3 problem H错误原因:一没有严格按照题意做题,学到的知识如何三个条件
全满足时跳出循环那么应该是!(p^q^a)==!p||!q||!a.

还有写switch语句一定要用defualt做默认条件

其语法:switch(可以是数字也可以是字符f)

所有case均在switch的大括号之内。

case (一定要有空格)f//这儿不用加(),,:语句,break;不用括号。

default:{

break;}
#include

int main()

{

inta,b;

charc;

scanf("%d",&a);

c=getchar();

scanf("%d",&b);

while(a!=0||b!=0||c!=' ')

{

    switch(c)

    {

        case'+':printf("%d\n",a+b);break;

    case'-':printf("%d\n",a-b);break;

    case'*':printf("%d\n",a*b);break;

    case'/':printf("%d\n",a/b);break;

    case'%':printf("%d\n",a%b);break;

    default: {printf("invalid op\n");break;}

    }

   scanf("%d",&a);

c=getchar();

scanf("%d",&b);

}

return0;

}

switch标准形式

switch(controllingExpression)

{

    case constantExpression1:statement1;break;

    case constantExpression2:statement2;break;

    case constantExpression3:statement3;break;

    ...

    default:statement;

}

//注意以后这种以某种判断为结束的题均使用

while(scanf()……&&!结束条件)

实验3 problem C:

错误原因没看见1. 它是一个完全平方数。2. 它是一个偶数。
教训做题一发入魂最好,不可不看题阿,但不管怎样都不要慌。

需要判断给定的一个整数是否同时满足如下三个条件:

1. 它是一个完全平方数,若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。

2. 它是一个偶数。

3. 它是一个正数。

#include

#include

int main()

{

    inti;

    scanf("%d",&i);

    ints=sqrt(i);

    if(i%2==0&&s*s==i)

    printf("yes");

else

    printf("no");

return0;

}

判断是否完全平方数就用:

int t=sqrt(n);

if(t*t==n)

输出等差数列的最好方式:

#include

#include

int main()

{

    int i,t,flag=0;

   int a,b,c;

   scanf("start = %d, step = %d, times = %d",&a,&b,&c);

   for(i=0;i

按照等差通项输出a+i*b,i=0,1,2,……;

实验4 problem A没看清题,每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应,输出没有换行。

实验4

登录密码验证 之二 一个很隐蔽的bug

gets和scanf的读取

海伦公式:

s=sqrt(p*(p-a)*(p-b)*(p-c)).

p=(a+b+c)/2;

杨辉三角函数核心代码

后面的均等与上一排同列和上一排前一列之和*/

a[i][j]=a[i-1][j]+a[i-1][j-1];
#include

int yanghui(int a[14][14])

{

    int i,j;

    for(i=1;i<14;i++)

    {

        a[i][1]=1;//初始化同样很重要。

    }

    for(i=2;i<14;i++)

    {

        for(j=1;j<=i;j++)//重点

a[i][j]=a[i-1][j-1]+a[i-1][j];

    }

}

int main()

{

    int n;

    int a[14][14]={0};

        yanghui(a);

    while(scanf("%d",&n)!=EOF)

    {

        int i,j;

        for(i=1;i<=n;i++)

        {

            for(j=1;j<=i;j++)

            {

                if(i!=n)

                {

                int k;

                for(k=0;k
#include

int main()

{

   int n;

   scanf("%d",&n);

   int i;

   for(i=0;i=0&&y>=0&&(x==(int)x&&y==(int)y))

          printf("%.0lf %.0lf\n",x,y);

          else

            printf("no result\n");

   }

    return 0;

}

鸡兔同笼

问题单纯解方程以及判断条件

if(x>=0&&y>=0&&(y==(int)y&&x==(int)x))输出整数可用%.0lf或者无符号长整形unsigned long long int

%llu这是重点。

输出整数的最低两位,一开始麻烦的做法,其实完全可以用%100算数。

#include

int main()

{

    int a[1010];

    int i,y=0,j=0;

    int ans=0;

    scanf("%d",&i);

    if(i>=0)

    {

        while(i&&j<2)

        {

          a[j]=i%10;

            i/=10;

            j++;

        }

        if(j==2)

        {

      while(j--)

        ans=(ans)*10+a[j];

        printf("%.2d",ans);

    }

    else

        printf("%d",a[0]);

    }

    else

    {

        int p=-1*i;

        while(p&&j<2)

        {

          a[j]=p%10;

            p/=10;

            j++;

        }

      if(j==2){

      while(j--)

        ans=(ans)*10+a[j];

        printf("%.2d",ans);

    }

  else

    {

        printf("%d",a[0]);

    }

    }

    return 0;

}
#include

intm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

intd[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

intisLeapyear(inty)

{

    if(y%400!=0&&y%100==0)return0;

    if(y%4==0)return1;

    else

        return0;

}

intisright(inta,intb,intc)

{

 if(b>12)

{

       printf("error date!\n");

    return0;

}

if(!isLeapyear(a)&&c>m[b])

{

       printf("error date!\n");

    return0;

}

if(isLeapyear(a)&&c>d[b])

{

   printf("error date!\n");

    return0;

}

return1;

}

int main()

{

    intn,i,j,sum=0;

    scanf("%d",&n);

    inta,b,c;

    for(i=0;i

[]的优先级比*高

()的优先级比*高,所以指针数组是int p1[10]; 是数组指针int(p2)[10];

int a[3][4];

int (*p)[4];

p=a;

p++;

如此便变成指向一维数组的指针,因为多一维相当于多一取地址。

二维数组的使用方法。

#include

int main()

{

    char s[6][6];

    gets(s[0]);

    gets(s[1]);

    gets(s[2]);

    char (*p)[6];

    p=s;

    gets(p+3);

    int i;

    for(i=0;i<=3;i++)

        puts(s[i]);

}

二分查找

int erfen(int min,int max)

{

    while(low<=high)

    {

        mid=(low+high)/2;

        if(value==array[mid])

            return mid;

        else if(value>array[mid])

            low=mid;

        else

            high=mid;

    }

}

查找第一次出现的位置。

while(scanf("%d",&k)!=EOF)

    for(j=1;j<=a[0];j++)

    {

        if(a[j]==k)

        {

            printf("%d\n",j);

            count=1;

            break;

        }

        if(count==0)

            printf("NOT FOUND\n");

        count=0;

    }

如果是查找最后一个就把for循环反过来用。

指针问题:如下所示,如果不用数组名必须使用初始化因为得让

int b=-1;

int *a=&b;

*a=2;

scanf("%d",a);

printf("%d",*a);

素数求法

#include

int isprime(int num)

{

  if(num==2||num==3)return 1;

  if(num%6!=1&&num%6!=5)

    return 0;

  int tmp=sqrt(num);

  for(int i=5;i<=tmp;i+=6)

  {

      if(num%i==0||num%(i+2)==0)

      return 0;

  }

  return 1;

}

你可能感兴趣的:(关于C语言狗血的理解这是重点)