本周是进入acm集训队的第一周,深刻的感受到了自己c的基础薄弱,打算做出改变。
接下是本周的学习内容:
一。
A+B for Input-Output Practice (IV)
Description:
Your task is to calculate the sum of some integers.
Input
Input contains multiple test cases, and one case one line. Each case starts with an integer N, and then N integers follow in the same line.
Output
For each test case you should output the sum of N integers in one line, and with one line of output for each line in input.
Sample
Inputcopy | Outputcopy |
---|---|
4 1 2 3 4 5 1 2 3 4 5 | 10 15 |
我的错误代码:
int main()
{
int m;
while(~scanf("%d",&m))
{
int a,b=0;
for(int i=1;i<=m;i++)
{
scanf("%d",&a);
b+=a;
}
printf("%d\n",b);
}
}
这个代码在逻辑上是正确的,但有一个小问题:它没有正确地处理输入结束的情况。由于题目没有明确指出输入结束的标志(如常见的 EOF 或特定的终止输入,如 0),因此使用 while(~scanf("%d",&m)) 来持续读取输入在某些情况下可能会导致无限循环(比如当输入流中包含非整数数据时)。
然而,在这个特定的问题中,由于每个测试案例都是以一个整数 N 开始,后跟 N 个整数,我们可以假设当输入流结束时(比如到达文件末尾或用户停止输入),scanf 将无法读取到整数,此时循环将自然终止(尽管不是通过检查 N 的值)。但在实际编程中,依赖这种隐式的输入结束可能不是最佳实践。
下面是一个稍微修改过的版本,它添加了一个检查来确保 scanf 成功读取了 m 个整数(尽管在这个特定问题中可能不是必需的):
#include <stdio.h>
int main() {
int m,a,sum = 0;
while(scanf("%d",&m)==1&&m>=0) { // 确保读取了m为整数,并且m非负
sum = 0; // 重置sum为0,为下一个测试案例做准备
for (int i = 0; i < m; i++) { // 注意循环是从0开始的
if (scanf("%d", &a) != 1) { // 检查是否成功读取了整数// 这里可以添加错误处理,但在这个简单例子中我们直接跳出循环
break;
}
sum += a;
}
printf("%d\n", sum);
}
return 0;
}
或者用!=EOF解决判断m的问题。
二。
猜数游戏
介绍
猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Toobig”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!";如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!";如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。 输入格式: 输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数、以及猜测的最大次数N。随后每行给出一个用户的输入,直到出现负数为止。
#include<stdio.h>
int main() {
int num, n;
int a;
int c = 1;
int x = 0; // 用于标记是否猜中数字
scanf("%d %d", &num, &n); // 注意在格式字符串中添加空格以更好地处理输入
do {
scanf("%d", &a);
if (a < 0) {
break; // 如果输入负数,则退出循环
}
if (a < num) {
printf("Too small\n");
} else if (a > num) {
printf("Too big\n");
} else if (a == num) {
x = 1; // 猜中数字
if (c == 1) {
printf("Bingo\n");
} else if (c <= 3) {
printf("Lucky You\n");
} else if (c <= n) {
printf("Good Guess\n");
}
break; // 猜中数字后退出循环
}
c++;
} while (c <= n && !x); // 循环直到猜测次数超过n或猜中数字
if (!x) {
printf("Game Over\n"); // 如果没有猜中数字
}
return 0;
}
swith case
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si5: wu6: liu7: qi8: ba9: jiu
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
if (n < 0) {
printf("fu ");
n = -n; // 转换为正数处理
}
do {
int d = n % 10; // 直接取当前最低位
switch (d) {
case 0: printf("ling"); break;
case 1: printf("yi"); break;
case 2: printf("er"); break;
case 3: printf("san"); break;
case 4: printf("si"); break;
case 5: printf("wu"); break;
case 6: printf("liu"); break;
case 7: printf("qi"); break;
case 8: printf("ba"); break;
case 9: printf("jiu"); break;
}
if (n > 9) // 如果n大于9,说明还有更高位需要打印,打印空格
printf(" ");
n /= 10; // 缩小n,准备处理下一位
} while (n > 0); // 当n为0时,说明所有位都已处理完毕
return 0;
}
求水仙花数
#include<stdio.h>
#include<math.h> // 引入math.h以使用pow函数
int main(){
int n, x, d, t, sum;
scanf("%d", &n);
// 遍历从10^(n-1)到10^n-1的所有数,即所有n位数
for (int i = pow(10, n-1); i < pow(10, n); i++) {
t = i; // 保存原始数
sum = 0; // 用于累加每个位上数字的n次幂
// 计算每个位上数字的n次幂之和
while (t > 0) {
d= t % 10; // 获取最低位
sum += pow(d, n); // 累加n次幂
t /= 10; // 去掉已处理的最低位
}
// 如果这个和等于原始数,则它是一个水仙花数
if (sum == i) {
printf("%d\n", i);
}
}
return 0;
}
本周是第一次写周记,内容很潦草,主要是很多题目有点难找,下周会每天编辑周记,最后总和发出来。