第一周学习记录

本周是进入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

InputcopyOutputcopy
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;
}

本周是第一次写周记,内容很潦草,主要是很多题目有点难找,下周会每天编辑周记,最后总和发出来。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值