admin管理员组

文章数量:1794759

ACM零基础新手入门详解

ACM零基础新手入门详解

emmmm,这一篇博客比较水,主要是不太会讲,只能以代码加运行效果图拿出来看看了。。。将就看看吧QAQ,由于比较水,所以博主可能时常会更新这篇博客,直到它能看的过去为止。。。。

这里有个博客我觉得写得很好。。。比我牛逼多了。萌新们可以看看blog.csdn/qq_23079443/article/details/81108901

首先给出一份代码:

#include <cstdio> int main() { printf ("hellow world!\\n"); return 0; }

运行效果图: 首先你得记住这玩意运行的是英文字符,也就是说如果你用中文输入法输入的话它会报错,中文是全角,英文是半角的来着。。。。但鉴于还是有很多人不会。。。。看下面吧QAQ: 我们需要的是英文,那么必须要让它显示“英”!!! 对于有些东西我们不必太懂它的运行机制,我们只要知道他是干什么的就好了。 比如对于:

#include < cstdio >

这是一个头文件,算的上是必须写的东西,这个就可以直接忽略了,反正写上去程序才能运行。只不过这是C++的头文件,如果使用的是C语言的编译器(就像手机的C语言编译器)那么就应该是这样的

#include <stdio.h>

C++和C语言的头文件,看到C++前面有个c的就把他去掉,在后面加个’.h’就好了

接下来就是int main()这个函数了,其格式为:

int main() { //******* }

他就会执行在这大括号里面的东西。不过这个东西是主函数。。。。新手到这里就可以了O(∩_∩)O。必须写这玩意就行了

printf

就是输出在屏幕上的意思,其具体格式为:

printf ("%d",x);

就是将双引号里面的东西输出。 其中分号是一个句子结束的意思。 其中x为一个被int类型所控制的整形,这里先忽略。 其中%是转义字符,如果不加%的话就会直接输出d这东西,而%d就是格式控制符,反正要输出一个整形变量就得用%d。。。。也先忽略吧QAQ

以下是一些实践:

printf ("d\\n");

\\n是在printf的双引号中表示换行的意思 假设我们这样写:

printf ("%d");

编译器不会报错,他会随机分配一个整形输出:

#include <cstdio> int main() { printf ("%d"); return 0; }

下面我们整一个整形变量,int x:表示x是一个绝对值不超过231-1的一个整数。(记住,只有先定义了才能够用,如果没有定义就使用的话会报错!!!!) 但刚开始的时候x也是被随机分配值的如果想以下这么写的话还是会随机输出东西。

#include <cstdio> int main() { int x; printf ("%d",x); return 0; }

所以我们要给x赋值:

#include <cstdio> int main() { int x; x=10; printf ("%d",x); return 0; }

‘=’号的意思是将右边的值赋给左边 其效果图: 。。。接下来我们就可以执行一些简单的操作了,比如说做一些运算:

#include <cstdio> int main() { int a,b; a=5,b=3; int c=a+b,d=a-b,e=a*b,k=a/b; printf ("%d%d%d%d",c,d,e,k); return 0; }

因为没有空格,所以就粘在一起了。那么我们将它的printf里面加一个空格就好了:

printf ("%d %d %d %d",c,d,e,k);

假装你们应该懂了ε=(#>д<)ノ

最后renturn 0;记住加上就好了,没有为什么(* ^ ▽ ^ *)。 现在我们不想每次都对a和b进行修改而达到我们想要的值。我们想直接在屏幕上输入a,b的值然后让计算机帮我们按照一定的程序算出东西来:

#include <cstdio> int main() { int a,b; scanf ("%d%d",&a,&b); int c=a+b,d=a-b,e=a*b,k=a/b; printf ("%d %d %d %d",c,d,e,k); return 0; }

那就使用scanf吧。‘&’是取地址的意思,记得加上就好了(* ^ ▽ ^*)。其实scanf和printf的格式差不多的这么看的话。但scanf对于输入的话也是格式控制来着。。。假设你的a输入结束了,你想输入b,那只要在输入不是整形的字符就好了比如空格就像这样: 最上面的是我们输入的a和b的值,但输入结束后只能按回车才能使得程序运行。

还有一个就是关于除法的。。。之前没写QAQ。。。整型/整型=整形。而且最后的这个整型是向下取整过后的整型。比如5/3=1、11/4=2…

接下来就是循环,计算机算得上是最大的优势: 一个是for循环和while循环:

#include <cstdio> int main() { int s=0; for (int i=1; i<=10; i++) s=s+i; printf ("%d\\n",s); return 0; }

大概意思就是令整形变量的初始值为1,当它小于等于10的时候就自增(相当于i=i+1的意思)。for的形式有很多,大家可以自己多试试,只要括号里面有两个分号就行了: for (; ; )、for (int i=1; ; )……

#include <cstdio> int main() { int s=0; int i=1; while (i<=10){ s=s+i; i++; } printf ("%d\\n",s); return 0; }

同样的效果。。。while(当满足该条件的时候做以下语句)。。现在我们接触到了大括号{}它的意思大概就是整个大括号里面的东西都是一句话。。。。

循环出现了,那么也可以说一下爆int的情况了,int的范围大概是21亿左右,很容易在循环中由于多次相加而爆掉比如就像上面的程序一样,累加10次,如果我每次加上的数在10亿左右(109就是1e9),那么s就会爆掉,显示一个很大的负数给你。。。。这个时候我们就要使用long long 了我们将使用int定义的s改为用long long来定义就好了:

long long s=0;

而long long 的格式控制符是lld,比起int 多了两个小写的‘L’那么也就是在输出的时候我们必须使用printf ("%lld",s);来进行输出。输入的时候也是一样,如果你输入的数据被你定义为long long形的你也应该使用%lld来进行输入。

我们ACM的比赛中题目也经常出现多组输入这种东西,也就是可以一直输入,它的操作有很多,比如处理到文件结束的多组输入,t组数据的多组输入,直到某一项为0的多组输入。。。

1.文件结束符为EOF,对于处理到文件结束的多组输入我们一般是这么写的:

while (scanf ("%d",&x)!=EOF) {........} while (~scanf ("%d",&x)) {.......}

也差不多就这两种写法。 2.t组数据的多组输入,那么首先得给出t是多少,所以先读入一个t,接下来一个循环从1到t每次运行一遍程序。比如:

#include <cstdio> int main() { int t,a,b; scanf ("%d",&t); for (int i=1; i<=t; i++){ scanf ("%d%d",&a,&b); printf ("%d\\n",a+b); } return 0; }

也就是输了两组A+B问题,但实际上我们不会用for来对组数做处理,我们一般使用:

while (t--) {.....}

好了,这里好像又涉及到了条件判断QAQ。。。我们while需要执行的时候必须满足括号里的条件,那么(t–)代表什么呢?大概就是先判断它存在与否,然后再把它减一后执行下面的程序。

条件的判断我只会if和else。。。。o(╥﹏╥)o,就先说说这个吧。其格式如下:

if (...){.....} else if (...){.......}

我觉得学过英语的都应该看得懂吧。。。就是当括号中条件成立的时候执行第一个,否则当第二个条件成立的时候执行第二个。我们的条件判断大概也就几种而已,就像存在与否,相等关系的判断,大小关系的判断:

if (a!=0) //表示a存在,即不等于0,也可以写成if (a) if (a==0) //表示a不存在,即a等于0的情况也写作if (!a) if (a>b) if (a<b) if (a>=b) if (a<=b)......

大概也就这几种,记住以下格式就行了,等于是==,赋值是=,大于等于是>=

执行一下程序吧:

#include <cstdio> int main() { int t,a,b; for (int i=1; i<=10; i++){ if (i%2) printf ("...\\n");//%代表取余的意思这里也就是i除以2的余数的意思 else if (i%2==0)printf ("***\\n"); } return 0; }

以上都是关于整数的运算,那么如果需要需要小数呢? 关于小数,即浮点型也有两个,相当于整形的int和long long

一个是float (精度不高)范围相当于int,另一个是double(精度较高能存的值也较大)范围相当于long long。

那么精度又是个什么东西呢?举个例子; 1在浮点数的存值可能为0.99999999,或1.000000001。即有一定的误差,但这并不妨碍,因为我们的答案都是精确到哪一位的,他会自动四舍五入。 对于他们的控制符是%f和%lf。要保留几位小数的话就是%.3f表示保留3位小数。

比如以下:

#include <cstdio> int main() { double s; scanf ("%lf",&s); printf ("%lf\\n",s); printf ("%.2lf\\n",s); return 0; }

其中浮点类型都有一个默认的位数保留比如第二行,它保留了后6位。。。

还有一个关于整型转浮点型的操作,一个是强制类型转换,还有一个是直接乘以1.0就好了:

int n; double s; s=(double)n; s=1.0*n;

。。。如果没有转换的话很多题目会答案出错(Wrong Answer)简称WA(哇)。。。

写一题吧。。感觉空口白讲一样。。。没啥作用: 题目链接www.luogu/problem/P1421

题目描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是1元9角,而班主任给小玉的钱是a元b角,小玉想知道,她最多能买多少只签字笔呢。

输入格式

输入的数据,在一行内,包括两个整数,依次表示a和b,a<=10000,b<=9。

输出格式

输出一个整数,表示小玉最多能买多少只签字笔。

输入输出样例 输入 10 3 输出 5


这道题的话直接换算一下就好了:一支笔需要多少角钱?19角。你总共有多少? a* 10+b角钱。那么你只需要把(a* 10+b)/19就好了。由于整型的向下取整。可以证明这样写是没有毛病的。。。

#include <cstdio> #include <cmath> int main() { int a,b; scanf ("%d%d",&a,&b); int s=(a*10+b)/19; printf ("%d\\n",s); return 0; }

。。。

下面给出一道需要浮点数运算的一题吧: 题目链接www.luogu/problem/P1422

题目描述

夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。

输入格式

输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。

输出格式

输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)。

输入输出样例 输入 267 输出 121.5

初中学过数学应该都会吧。。。。简单的一个分段函数就好了: 1.当用电<=150的时候直接将n* 0.4463 2.150到400的部分 * 0.4663 3.其余的部分*0.5663 下面是过了的代码:

#include <cstdio> int main () { int n; double f; scanf ("%d",&n); if (n<=150) { f=n*0.4463; printf ("%.1f",f); } else if (n<=400) { f=150*0.4463+(n-150)*0.4663; printf ("%.1f",f); } else {//前面都不成立执行(之前没讲else,以为你们应该知道else if后不用讲了QAQ) f=150*0.4463+(400-150)*0.4663+(n-400)*0.5663; printf ("%.1lf",f); } return 0; }

。。。当然这个写法比较笨,但比较好看懂,而我们有时候确实不必要追求一些花里胡哨的东西(需要永远记住的是越复杂(不管是想法还是代码操作)的代码越容易出错,越简单粗暴的代码越不容易出错(当然你的想法要对)):

emmm,好了,写不出来了QAQ好菜啊,溜了溜了。。。。

本文标签: 详解新手入门基础ACM