PTA刷题笔记(纠细节 有详解)

·7-19 支票面额

代码如下:

复制代码
#include <stdio.h>
int main ()
{
    int n;
    scanf("%d", &n);
    int y, f;
    int flag = 0;
    for(y = 0; y < 100; y ++)//y一定小于100,因为如果大于100的话出纳员不会拿大于100的分
    {
        for(f = 0; f < 100; f ++)//分一定小于100
        {
            if( n + 199 * y == 98 * f )//f * 100 + y = n + 2 * y * 100 + 2 * f 
            {
                flag = 1;
                break;
            }
        }
        if(flag == 1)
            break;//上面的break只能跳出上一个循环
    }
    if(y >= 100)//说明不合理,舍弃
    {
        printf("No Solution");
    }
    else
    {
        printf("%d.%d",y,f);
    }
    return 0;
}

·7-20 打印九九口诀表

代码如下:

复制代码
#include<stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++)//i从1到n,控制乘法表的行数,每i行打印i个式子
    {
        for(int j = 1; j <= i; j ++)//列数
        {
            printf("%d*%d=%-4d", j, i, i * j);//%-4d表示左对齐占四个字符宽度
        }
        printf("\n");
    }
    return 0;
}

·7-21 求特殊方程的正整数解

代码如下:

复制代码
#include<stdio.h>
#include<math.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int x, y = 0;
    int found = 0;//标记是否找到解
    int max = (int)sqrt(n);//确定循环的最大值
    for(x = 1; x <= max; x ++)
    {
        for(y = x; y <= max; y ++)//y从x开始,确保x <= y
        {
            if(x * x + y * y == n)
            {
                printf("%d %d\n", x, y);
                found = 1;//标记已找到解
            }
        }
    }
    if(!found)
    {
        printf("No Solution\n");
    }
    return 0;
}

·7-24 约分最简分式

代码如下:

复制代码
#include<stdio.h>

int main()
{
    int n, m = 0;
    scanf("%d/%d", &n, &m);
    int tmp = 0;
    int a = n;
    int b = m;
    while(tmp = a % b)//辗转相除法求最大公因数
    {
        a = b;
        b = tmp;
    }//最大公因数是b
    printf("%d/%d", n / b, m / b);
    return 0;
}

·7-25 念数字

错误代码:

复制代码
#include<stdio.h>
#include<string.h>

int main()
{
    char num[20];
    scanf("%s", num);
    int start = 0;
    int len = strlen(num);
    int flag = 0;
    const char *arr[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    if(num[0] == '-')
    {
        printf("fu ");
        start = 1;
    }
    for(int i = start; i < len; i ++)
    {
        flag = num[i] - '0';
        printf("%s ", arr[flag]);
    }
    return 0;
}

错误原因:没有看到题目要求"行末没有空格"导致格式错误

正确代码:

复制代码
#include<stdio.h>
#include<string.h>

int main()
{
    char num[10];//存储输入的数字字符串
    scanf("%s", num);
    int start = 0;
    int len = strlen(num);
    int flag = 0;
    //数字到拼音的映射,用指针数组存储字符串(相比于二维字符数组更常用)
    const char *arr[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    //处理负号
    if(num[0] == '-')
    {
        printf("fu");
        start = 1;
        if(len > 1)
        {
            printf(" ");//表示符号后面跟着的空格,只有后面还有数字才加空格
        }
    }
    for(int i = start; i < len; i ++)
    {
        flag = num[i] - '0';//将字符转化为数字
        printf("%s", arr[flag]);
        if(i != len - 1)
        printf(" ");//表示数字之间的空格
    }
    return 0;
}

解题思路

  1. 首先处理负号,如果数字是负数,先输出"fu"。

  2. 将数字转换为字符串,方便逐位处理。

  3. 创建一个数字到拼音的映射表。

  4. 遍历数字字符串的每一位,查找对应的拼音并输出。

  5. 注意控制空格,确保最后一个拼音后面没有空格。

·7-26 单词长度

代码如下:

复制代码
#include <stdio.h>

int main() {
    char c;
    int length = 0;
    int first_word = 1; // 标记是否是第一个单词,用于控制空格输出
    
    while (1) {
        scanf("%c", &c);
        
        // 遇到句点结束输入
        if (c == '.') {
            // 处理句点前的单词(如果有)
            if (length > 0) {
                if (first_word) {
                    printf("%d", length);
                    first_word = 0;
                } else {
                    printf(" %d", length);
                }
            }
            break;
        }
        
        // 遇到空格
        if (c == ' ') {
            // 如果正在统计单词,输出长度
            if (length > 0) {
                if (first_word) {
                    printf("%d", length);
                    first_word = 0;
                } else {
                    printf(" %d", length);
                }
                length = 0;
            }
            // 跳过连续空格
            continue;
        }
        
        // 普通字符,增加单词长度
        length++;
    }
    
    printf("\n");
    return 0;
}

代码说明

  1. 使用`scanf("%c", &c)`逐个字符读取输入

  2. 使用`length`变量记录当前单词的长度

  3. 使用`first_word`标记控制输出格式,确保第一个单词前没有空格

  4. 遇到句点时,先处理可能存在的最后一个单词,然后结束循环

  5. 遇到空格时,如果正在统计单词,则输出当前单词长度

  6. 最后输出换行符

相关推荐
爱上妖精的尾巴25 分钟前
3-18 WPS JS宏 颜色设置实例应用(按条件设置单元格颜色)学习笔记
javascript·笔记·学习·excel·wps·js宏·jsa
W说编程1 小时前
算法导论第十四章 B树与B+树:海量数据的守护者
c语言·数据结构·b树·算法·性能优化
Jay Kay1 小时前
深入解析协程:高并发编程的轻量级解决方案
开发语言·c++·算法
岁忧1 小时前
(LeetCode 每日一题) 2966. 划分数组并满足最大差限制 (贪心、排序)
java·c++·算法·leetcode·职场和发展·go
mit6.8241 小时前
[Linux_core] “虚拟文件” | procfs | devfs | 上下文
linux·c语言·c++
lifallen1 小时前
Java BitSet类解析:高效位向量实现
java·开发语言·后端·算法
学不好python的小猫2 小时前
7-4 身份证号处理
开发语言·python·算法
teeeeeeemo2 小时前
JS数据类型检测方法总结
开发语言·前端·javascript·笔记
云墨-款哥的博客2 小时前
失业学习-前端工程化-webpack基础
前端·学习·webpack
好易学数据结构3 小时前
可视化图解算法52:数据流中的中位数
数据结构·算法·leetcode