本文会暂时以 C++ 的读入和输出写,以后的代码都将用 `scanf` 和 `printf` 作为主要的读入和输出。 ## 1300 这可能是你写的第一个 ACM 的题目,所以,我在这里会详细的讲一讲我们将如何解决这个问题。 可能你会觉得这个题目十分的简单,但是我们看正确率确是 181/402,所以我会介绍新人会遇到的问题。 **问题1** 多余的输出。请看如下代码: ```cpp #include using namespace std; int main() { int a,b; cout << "请输入a,b:" << endl; return 0; } ``` 这只是一部分代码,但是我想可能很多的人开始会写"请输入"这样的句子。 同学们请你想一想,一份代码,我如何判断你的代码是正确的? 可能是由某个老师来看,然后看你的代码是否对。显然,这样是不可能的! 我们的测评都是由机器来判定的。 而判断的数据就是你的输出(例如 `printf`、`putchar`、`puts`、`cout` 这样的句子输出的内容); 而在测评的时候,我们会将你的代码编译,并输入我们的测试数据(也就是要读入的数据); 机器通过对比你的输出和我们提前提供的标准答案是否一致来判断你的答案是否正确。 这里给大家提供部分的 1300 的输入数据和标准输出数据: 输入: ``` 0 0 -1 1 1 -1 1949 15390 22139 30520 ``` 输出: ``` 0 0 0 17339 52659 ``` 也就是说,我们会输入类似 `"0 0"` 这样的数据,而你的输出只能是 `"0\n"`(`\n` 代表这里的换行),其他都是错误的。 **第二个问题**:题目的多组输入,如何解决。 某些人可能针对多组读入会这样写: ```cpp #include using namespace std; int main() { int a,b; while(1) { cin >> a >> b; cout << a+b << endl; } return 0; } ``` 但是显然这样是不行的,`while(1)` 是一个死循环,而程序是要运行到 `main` 函数 `return 0` 才算是停止。 这样写就会被判定为 Time Limit Exceed(时间超限)。 所以如何解决呢?这里不做解释,直接上代码。 C++ 写法: ```cpp #include using namespace std; int main() { int a,b; while(cin >> a >> b) { cout << a+b << endl; } return 0; } ``` C 语言写法: ```c #include int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) //或者写成while(~scanf("%d%d",&a,&b)) { printf("%d\n",a+b); } return 0; } ``` 这样我们就解决了多组输入的问题了,以上的两个代码也就是题目的 AC 代码了。 ## 1301 这题对大多数人比多组输入更好解决,直接上 AC 代码: ```cpp #include using namespace std; int main() { int n,a,b; cin >> n; while(n--) // 当然更加常规的写法是for(int i = 0;i < n;i++) { cin >> a >> b; cout << a+b << endl; } return 0; } ``` ## 1302 这题也很简单,请看代码理解: ```cpp #include using namespace std; int main() { int a,b; while(cin >> a >> b,a!=0||b!=0) //逗号分隔开,其实while里面只是判断了"a!=0||b!=0". { cout << a+b << endl; } return 0; } ``` ## 1303 类似,同上。 ```cpp #include using namespace std; int main() { int n,a,sum=0; while(sum=0,cin >> n,n) //记得每次开始都要把sum的值置为0 { while(n--){cin >> a;sum+=a;} cout << sum << endl; //不要忘记换行哦 } return 0; } ``` ## 1304 ```cpp #include using namespace std; int main() { int n,m,a,sum=0; cin >> n; while(n--) { cin >> m; while(m--) {cin >> a;sum+=a;} cout << sum << endl; sum=0; } return 0; } ``` ## 1305 ```cpp #include using namespace std; int main() { int n,a,sum; while(cin >> n) { while(n--) {cin >> a;sum+=a;} cout << sum << endl; sum=0; } return 0; } ``` ## 1306 每行输出后接一个空行意思其实就是输出两个换行。 ```cpp #include using namespace std; int main() { int a,b; while(cin >> a >> b) {cout << a+b << "\n\n";} return 0; } ``` ## 1307 综合挑战。 ```cpp #include using namespace std; int main() { int t,n,tmp,s=0; cin >> t; while(t--) { cin >> n; while(n--) {cin >> tmp;s+=tmp;} cout << s << "\n\n"; s=0; } return 0; } ``` ## 1308 好的,枯燥的 a+b 终于结束了,现在来开始你真正的第一题。 这里我们用三种方法实现: - 方法1:利用类型强制转换输出,例如我们定义了一个整形数字 `int a`,我们直接使用类型强制转换输出 `(char)a` 即可。 ```cpp #include using namespace std; int main() { int t,c; cin >> t; while(t--) {cin >> c;cout << (char)c;} return 0; } ``` - 方法2:使用 `putchar()` 函数输出。 ```cpp #include using namespace std; int main() { int t,c; cin >> t; while(t--) {cin >> c;putchar(c);} return 0; } ``` - 方法3(C 语言):`%c` 格式化输出。 ```c #include int main() { int t,c; scanf("%d",&t) while(t--) {scanf("%d",&c);printf("%c",c);} return 0; } ``` ## 1309 题目也很简单,但是这里我们有一个小的问题,就是 C++ 输出如何保留两位小数。 这里我们就需要引用头文件 `` 了,使用 `fixed` 和 `setprecision(2)` 来保留两位小数,如果不写 `fixed` 的话,则是设置有效数字位数。 ```cpp #include #include using namespace std; int main() { double sum=0,tmp; for(int i = 0;i < 12;i++) {cin >> tmp;sum+=tmp;} cout << "¥"; cout << fixed << setprecision(2) << sum/12; return 0; } ``` 或者使用 C 语言的 `printf` 来输出。 注意 C++ 是几乎完全兼容 C 语言的,也就是说你即使是写的 C 语言的代码以 C++ 提交,编译上不会有任何问题,反之则不行。 输出 double 型浮点数的时候,输出的占位符是 `%f`,而 `%.nf` 表示保留 n 位小数(注意这里的 n 是数字,不能是变量)。 ```c #include int main() { int i=12,j; double salary,avg,total=0; for(j=0;j Loading... 本文会暂时以 C++ 的读入和输出写,以后的代码都将用 `scanf` 和 `printf` 作为主要的读入和输出。 ## 1300 这可能是你写的第一个 ACM 的题目,所以,我在这里会详细的讲一讲我们将如何解决这个问题。 可能你会觉得这个题目十分的简单,但是我们看正确率确是 181/402,所以我会介绍新人会遇到的问题。 **问题1** 多余的输出。请看如下代码: ```cpp #include <iostream> using namespace std; int main() { int a,b; cout << "请输入a,b:" << endl; return 0; } ``` 这只是一部分代码,但是我想可能很多的人开始会写"请输入"这样的句子。 同学们请你想一想,一份代码,我如何判断你的代码是正确的? 可能是由某个老师来看,然后看你的代码是否对。显然,这样是不可能的! 我们的测评都是由机器来判定的。 而判断的数据就是你的输出(例如 `printf`、`putchar`、`puts`、`cout` 这样的句子输出的内容); 而在测评的时候,我们会将你的代码编译,并输入我们的测试数据(也就是要读入的数据); 机器通过对比你的输出和我们提前提供的标准答案是否一致来判断你的答案是否正确。 这里给大家提供部分的 1300 的输入数据和标准输出数据: 输入: ``` 0 0 -1 1 1 -1 1949 15390 22139 30520 ``` 输出: ``` 0 0 0 17339 52659 ``` 也就是说,我们会输入类似 `"0 0"` 这样的数据,而你的输出只能是 `"0\n"`(`\n` 代表这里的换行),其他都是错误的。 **第二个问题**:题目的多组输入,如何解决。 某些人可能针对多组读入会这样写: ```cpp #include <iostream> using namespace std; int main() { int a,b; while(1) { cin >> a >> b; cout << a+b << endl; } return 0; } ``` 但是显然这样是不行的,`while(1)` 是一个死循环,而程序是要运行到 `main` 函数 `return 0` 才算是停止。 这样写就会被判定为 Time Limit Exceed(时间超限)。 所以如何解决呢?这里不做解释,直接上代码。 C++ 写法: ```cpp #include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b) { cout << a+b << endl; } return 0; } ``` C 语言写法: ```c #include <stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) //或者写成while(~scanf("%d%d",&a,&b)) { printf("%d\n",a+b); } return 0; } ``` 这样我们就解决了多组输入的问题了,以上的两个代码也就是题目的 AC 代码了。 ## 1301 这题对大多数人比多组输入更好解决,直接上 AC 代码: ```cpp #include <iostream> using namespace std; int main() { int n,a,b; cin >> n; while(n--) // 当然更加常规的写法是for(int i = 0;i < n;i++) { cin >> a >> b; cout << a+b << endl; } return 0; } ``` ## 1302 这题也很简单,请看代码理解: ```cpp #include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b,a!=0||b!=0) //逗号分隔开,其实while里面只是判断了"a!=0||b!=0". { cout << a+b << endl; } return 0; } ``` ## 1303 类似,同上。 ```cpp #include <iostream> using namespace std; int main() { int n,a,sum=0; while(sum=0,cin >> n,n) //记得每次开始都要把sum的值置为0 { while(n--){cin >> a;sum+=a;} cout << sum << endl; //不要忘记换行哦 } return 0; } ``` ## 1304 ```cpp #include <iostream> using namespace std; int main() { int n,m,a,sum=0; cin >> n; while(n--) { cin >> m; while(m--) {cin >> a;sum+=a;} cout << sum << endl; sum=0; } return 0; } ``` ## 1305 ```cpp #include <iostream> using namespace std; int main() { int n,a,sum; while(cin >> n) { while(n--) {cin >> a;sum+=a;} cout << sum << endl; sum=0; } return 0; } ``` ## 1306 每行输出后接一个空行意思其实就是输出两个换行。 ```cpp #include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b) {cout << a+b << "\n\n";} return 0; } ``` ## 1307 综合挑战。 ```cpp #include <iostream> using namespace std; int main() { int t,n,tmp,s=0; cin >> t; while(t--) { cin >> n; while(n--) {cin >> tmp;s+=tmp;} cout << s << "\n\n"; s=0; } return 0; } ``` ## 1308 好的,枯燥的 a+b 终于结束了,现在来开始你真正的第一题。 这里我们用三种方法实现: - 方法1:利用类型强制转换输出,例如我们定义了一个整形数字 `int a`,我们直接使用类型强制转换输出 `(char)a` 即可。 ```cpp #include <iostream> using namespace std; int main() { int t,c; cin >> t; while(t--) {cin >> c;cout << (char)c;} return 0; } ``` - 方法2:使用 `putchar()` 函数输出。 ```cpp #include <iostream> using namespace std; int main() { int t,c; cin >> t; while(t--) {cin >> c;putchar(c);} return 0; } ``` - 方法3(C 语言):`%c` 格式化输出。 ```c #include <stdio.h> int main() { int t,c; scanf("%d",&t) while(t--) {scanf("%d",&c);printf("%c",c);} return 0; } ``` ## 1309 题目也很简单,但是这里我们有一个小的问题,就是 C++ 输出如何保留两位小数。 这里我们就需要引用头文件 `<iomanip>` 了,使用 `fixed` 和 `setprecision(2)` 来保留两位小数,如果不写 `fixed` 的话,则是设置有效数字位数。 ```cpp #include <iostream> #include <iomanip> using namespace std; int main() { double sum=0,tmp; for(int i = 0;i < 12;i++) {cin >> tmp;sum+=tmp;} cout << "¥"; cout << fixed << setprecision(2) << sum/12; return 0; } ``` 或者使用 C 语言的 `printf` 来输出。 注意 C++ 是几乎完全兼容 C 语言的,也就是说你即使是写的 C 语言的代码以 C++ 提交,编译上不会有任何问题,反之则不行。 输出 double 型浮点数的时候,输出的占位符是 `%f`,而 `%.nf` 表示保留 n 位小数(注意这里的 n 是数字,不能是变量)。 ```c #include <stdio.h> int main() { int i=12,j; double salary,avg,total=0; for(j=0;j<i;j++) { scanf("%lf",&salary); total+=salary; } avg=total/i; printf("¥%.2f\n",avg); //%lf等价于%f return 0; } ``` Last modification:January 13, 2019 © Allow specification reprint Support Appreciate the author Like 如果觉得我的文章对你有用,请随意赞赏
One comment
test(这只是个测试)