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

原创

求1+2+……+n=?

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

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

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<stdio.h>

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<stdio.h>

#include<math.h>

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<stdio.h>

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<stdio.h>

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<stdio.h>

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<stdio.h>

#include<math.h>

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<stdio.h>

#include<math.h>

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<c;i++)

   {

       if(flag)printf(" ");

       printf("%d",a+i*b);

       flag=1;

   }

return0;

}

按照等差通项输出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<stdio.h>

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<n-i;k++)

                  if(j==1) printf("  ");

                printf("%4d",a[i][j]);

                }

                if(i==n)

                {

                printf("%4d",a[i][j]);

                }

            }

                          printf("\n");

        }

        printf("\n");

    }

}
#include<stdio.h>

int main()

{

   int n;

   scanf("%d",&n);

   int i;

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

   {

       int a,b;

       scanf("%d%d",&a,&b);

       double x=(4*a-b)/2.0;

       double y=(b-2*a)/2.0;

       if(x>=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<stdio.h>

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<stdio.h>

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<n;i++)

    {

        sum=0;

scanf("%d-%d-%d",&a,&b,&c);

isLeapyear(a);

if(isright(a,b,c))

{

if(!isLeapyear(a))

{

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

    {

        sum+=m[j];

    }

    printf("%d\n",sum+c);

}

if(isLeapyear(a))

{

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

    {

        sum+=d[j];

    }

    printf("%d\n",sum+c);

}

}

    }

return0;

}

[]的优先级比*高

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

int a[3][4];

int (*p)[4];

p=a;

p++;

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

二维数组的使用方法。

#include<stdio.h>

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<stdio.h>

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;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容