下面我们介绍几种常见的输入输出格式。
A+BⅠ
这种输入的典型题目就是A+B
此题只要求用户求A+B的和,但此类题目往往说明测试数据有多组。则默认是到文件(后台测试用例在文件里)末尾结束。我们则可以采用循环的方式不断接收测试用例,并且每接收一组输出一组(不必全部输入再全部输出,因为OJ只比对一次最后的结果)。
参考C代码:
#include<stdio.h>
int main()
{
int a,b;
while(scanf(“%d%d”,&a,&b)==2) //利用scanf的返回值
{
printf(“%d\n”,a+b);
}
return 0;
}
A+BⅡ
依然是A+B,我们可以看一下这道题
依然是求A+B,但它的输入数据为:
2
1 5
10 20
输出为:
6
30
此题相比第一道而言,会提前告诉你是几组数据,第一行的2就表示有两组数据。则此时我们可以考虑这样写:
#include<stdio.h>
int main()
{
int n;
int a,b;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
A+B Ⅲ
继续是A+B,不同的是题目中说明,有多组数据,但是以A和B都为0时结束,则此时,就要做判断。不能依然输出0。
参考答案:
#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
if(a== 0 && b==0) break;
printf("%d\n",a+b);
}
return 0;
}
A+B Ⅳ
题目描述:此类题目是求n个数的和,输入为先输入一个数组n,然后后面跟n个数字,求这n个数字的和。同样有多组数据,当n=0时结束。题目链接
样例输入:
4 1 2 3 4
5 1 2 3 4 5
0
样例输出:
10
15
参考写法:
#include<stdio.h>
int main()
{
int n;
int sum,temp;
while(scanf("%d",&n) && n)
{
sum=0;
while(n--)
{
scanf("%d",&temp);
sum+=temp;
}
printf("%d\n",sum);
}
return 0;
}
总结:
常见的ACM的输入输出格式如这些。
多组数据可能还会用到EOF、NULL这些宏。比如scanf、getchar、gets的返回值。
万变不离其宗,有些题目可能是这些格式的组合,亦或者是个别情况的变种,比如输出格式要求的变化等等,就需要各位ACMer灵活多变了。
在读取字符时,尤其是单个字符,建议直接 %s
,因为可能后面会有空格、回车、Tab,scanf读取时并不会忽略它们,这就导致我们后续输入会读到这些字符,所以我们就不用 %c
一个个读入,直接把字符当作字符串读入,存入char变量或者char数组
我们都知道有四舍五入,但是在计算机中为了更加精确的表示数据,采用的是奇进偶舍(也叫四舍六入五成双规则、银行进位法)。比如使用 %.2lf
输出double类型的数据。如果第三位是大于5就进位;小于5不进位;等于5且后面没有数,看前一位是不是偶数,奇进偶不进,若是后面有数直接进位,不用管。总结一句话就是 >5进位,<5舍去,=5奇进偶舍。
上取整
求余为正数
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1
如果 均是正整数且互质,那么由 不能凑出的最大数是 。
getline读n行数据时,需要之前先读一次,为的是读掉第一行的回车
stringsteam的用法
闰年问题
1. 整百年,并且能被4整除
2. 非整百年,能被400整除不能被3200整除
3.
上面的两个都是在1万年以内的计算方法,足够用了
#include<iostream>
int main()
{
int year;
std::cin>>year; //输入待判断年份,如2008
std::cout<<year<<(((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0 && year % 3200 != 0) || year % 172800 == 0
)
) == 1 ? "年是闰年" : "年是平年")<<std::endl;
return 0;
}