西工大noj(C/C++)100题参考题解及注意事项(2024)

06-01 1332阅读

西工大noj100题

说在前面:所有程序设计题目的题解都是在自己思考过以后看才能有所收获,题解只是一个参考,看懂思路后最好自己从0开始敲一遍!!!

如果对某一题有更好的思路

欢迎评论区交流或者私信我

持续更新~

更新时间:2024.12.29

(目录自动生成在文章右边哦~)

本文优势:

1.以《算法笔记》(胡凡 曾磊)为蓝本,内容充实有依据

2.通俗易懂,初学者也可无障碍阅读

3.精心挑选全站最优博文,为读者提供拓展阅读链接

4.一题多解,拓宽读者题解思路

5.解题过程中带领读者回顾基础知识点

6.对素数等热门题总结出模板,方便读者积累

7.题目完整清晰,题解注释清楚

8.对于较难的题目,给出清晰的解题思路和调试过程

9.题目后用括号标注注意事项或主要解题算法和步骤

10.提供应试技巧和常见错误,助力考生金榜题名

……

考前提醒

1.重视模板:文件这类题是有固定的模板的,不要以为题号比较靠后的题会很难,实际上文件这块儿的难度不会超过循环题。这也提示我们考前一定要准备一些常用的模板,比如排序(可以选择冒泡、快排、归并等等,或者直接用C++算法库里的sort()也可以)字符串的题推荐使用STL。有时遇到解题逻辑没问题,但实际输出和期望不符时可以考虑使用C++的cin,cout,有奇效。

2.先易后难:这也提示我们考试的时候先快速浏览10道题,把一眼看上去就有思路的题先做了,保证拿到通过考试的分数,然后再做算法等较难的题,做题顺序不一定要按照题号顺序来。

3.复制它善:写代码时要养成复制粘贴的好习惯,我说的不是直接复制别人的题解,而是自己写的时候,同一道题目,一些相同结构的循环,函数可以前后复制粘贴;不同的题目,基本的函数库,main函数架构都是一样的吧,也可以复制粘贴,节省时间,考试只有90min,要完成10道题时间还是很不富裕的(进考场还未开考之前听监考老师安排,如果可以先打开cb,就把能include的都包含进去,考的时候cb不强制全屏,可以缩小界面放在考试题目旁边对着敲)

4.细节要看:比如分号,数据类型((比如sqrt(double x),不要降低精度,long long可以有效防止数据溢出,但是int更常用),main和mian,scanf要有&而printf没有&,左右括号不匹配,中英文输入法,以及样例输出中隐含的格式(如空格,换行等)

5.临危不乱:要习惯随时编译并检查输出,或者写完后打断点调试程序,拿到题目可以先分成几个子任务然后分别解决,如上实在解不了的题先选择性跳过,最后有时间再尝试枚举,暴力输出法,或者干脆只解决1-2个子任务,可以通过部分测试样例,拿到一定分数。遇到题目描述不清的要及时举手向监考老师询问。

/*考试能用到的模板基本涵盖在100道noj中,对于部分常用小模板我设置了二级小标题,如判断素数,求整数位数等,读者可以很容易地在目录中找到它们。另外推荐一篇模板总结得还不错的博文:2023西工大NOJ (C语言版) 完结!!!-CSDN博客,读者可自行参考总结*/

/*对与初学者,IDE以及外设的选择推荐看:西北工业大学 NOJ 2023 程序设计基础(C++) 完结撒花(已停止维护)_西工大noj-CSDN博客*/

001:Hello World

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include
int main(){
    printf("Hello World\n");
    return 0;
}

注意:Hello和World首字母大写,且中间含空格。在其他题目中也要注意大小写的问题!

       另外要注意的是,在使用大部分IDE集成编译环境的时候(如Dev-C++、CodeBlocks等),新建项目的代码文件会给出一份初始代码,里面是包括基础的头文件和main函数的,但在考试和竞赛的时候这些均不会给出,需要同学们自己记忆,当然部分竞赛和考试也允许携带纸质资料,如果万一记不起来了可以翻书查阅。

另外往年同学们犯的错误比较多的情况是:

1.语句结束后忘记写分号

2.函数的()用的是中文输入法

3.main写成mian

4.括号不成对

5.scanf忘记写&符号

6.判断语句只有一个等于号,应该是if(value = = 1)这种形式

7.输入输出不注意大小写,回车,空格等问题

8.不按样例输出的格式来,忘记单位,空格或者单位转换

9.循环条件不注意边界值检验,导致死循环

10.数据类型没用对,或者忘记初始化,或者空间设小了导致溢出

……

总之,以上这些低级错误希望同学们在考试的时候注意检查,有时候编译错误只是因为这些小错。

002:A+B

西工大noj(C/C++)100题参考题解及注意事项(2024)

       这里注意要养成良好的变成习惯,每个参数的命名都要有实际意义,比如这里的“和”命名为“sum”,而不要abcdefg这样随意地取参数,这样不仅会降低代码的可读性,有时也会使我们在编写代码的过程中忘记参数的含义,影响思路。

#include 
int main()
{
    int a,b,sum;
    scanf("%d %d", &a, &b);
    sum = a + b;
    printf("%d\n", sum);
    return 0;
}

003:数据类型大小及范围

西工大noj(C/C++)100题参考题解及注意事项(2024)

西工大noj(C/C++)100题参考题解及注意事项(2024)

注意内存大小是以字节为单位的,比如int对应4字节,所以sizeof(int)= 4,其中sizeof()是反映参数对应数据类型所占的内存大小。

特别地,由于char字符类型只占1字节,所以sizeof()也可以用来求字符数组的大小

这里还需要注意区分sizeof()和 strlen()的区别:

西工大noj(C/C++)100题参考题解及注意事项(2024)

代码示例:

char str[] = "Hello";
printf("strlen: %lu\n", strlen(str));  // 5
printf("sizeof: %lu\n", sizeof(str));  // 6 (因为包含 '\0')

参考题解1:(利用sizeof(),推荐) 

#include 
#include 
int main() {
    int choice;
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            printf("%zu,%d,%d\n", sizeof(char), CHAR_MIN, CHAR_MAX);
            break;
        case 2:
            printf("%zu,%d,%u\n", sizeof(unsigned char), 0, UCHAR_MAX);
            break;
        case 3:
            printf("%zu,%d,%d\n", sizeof(short), SHRT_MIN, SHRT_MAX);
            break;
        case 4:
            printf("%zu,%d,%u\n", sizeof(unsigned short), 0, USHRT_MAX);
            break;
        case 5:
            printf("%zu,%d,%d\n", sizeof(int), INT_MIN, INT_MAX);
            break;
        case 6:
            printf("%zu,%u,%u\n", sizeof(unsigned int), 0, UINT_MAX);
            break;
        case 7:
            //printf("%zu,%d,%d\n", sizeof(int), INT_MIN, INT_MAX);
            printf("%zu,%ld,%ld\n", sizeof(long), LONG_MIN, LONG_MAX);
            break;
        case 8:
            printf("%zu,%u,%lu\n", sizeof(unsigned long), 0UL, ULONG_MAX);
            //printf("%zu,%u,%u\n", sizeof(unsigned int), 0, UINT_MAX);
            break;
        case 9:
            printf("%zu,%lld,%lld\n", sizeof(long long), LLONG_MIN, LLONG_MAX);
            break;
        case 10:
            printf("%zu,%u,%llu\n", sizeof(unsigned long long), 0ULL, ULLONG_MAX);
            break;
        default:
            printf("无效的编号\n");
            break;
    }
    return 0;
}

参考题解2:(暴力枚举,不推荐,但是考试或竞赛中如果实在做不出来可以采用,直接printf()或者完成题目子任务以通过部分测试点,常见赛制都会以通过测试点数量计分) 

#include
int main(){
    int a;
    scanf("%d",&a);
    if(a==1){
        printf("1,-128,127");
    }
    if(a==2)
    {
        printf("1,0,255");
    }
    if(a==3)
    {
        printf("2,-32768,32767");
    }
    if(a==4)
    {
        printf("2,0,65535");
    }
    if(a==5)
    {
        printf("4,-2147483648,2147483647");
    }if(a==6)
    {
        printf("4,0,4294967295");
    }if(a==7)
    {
         printf("4,-2147483648,2147483647");
    }if(a==8)
    {
          printf("4,0,4294967295");
    }
    if(a==9)
    {
        printf("8,-9223372036854775808,9223372036854775807");
    }
    if(a==10)
    {
        printf("8,0,18446744073709551615");
    }
}

004:平均值

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
#include 
int main()
{
    long long a,b,c;
    scanf("%lld %lld", &a, &b);
    c = (a + b)/2;
    printf("%lld\n", c);
    return 0;
}

注意:此题虽然题目为整型,但是实际需要long long 长整型才能AC,否则会WA!

另外:要注意各类数据类型的数据范围,比如当数量级超过10^9的时候,int就不再适用了,此时就需要使用long long,防止数据溢出。

如果有兴趣了解更多知识,这里给大家推荐一个网站:

C 语言教程 | 菜鸟教程

另外,如果坚持要使用int的话,建议使用公式:c = a + (b - a)/2;

因为noj提供的测试样例最多只允许一次误差(整型数据类型强行取整,去除小数部分)

005:进制转换

西工大noj(C/C++)100题参考题解及注意事项(2024)

基础知识回顾: %X(十六进制大写),%x(十六进制小写), %o(八进制)

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
int main(){
    unsigned int n;
    scanf("%d", &n);
    printf("%X,%o", n, n);
    return 0;
}

// 这里其实最好来说“%d”应该替换为“%u”,更为严谨。

006:浮点数输出

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
int main(){
    double n;
    scanf("%lf", &n);
    printf("%.6lf,%.2lf,%.8lf", n, n, n);
    return 0;
}

007:动态宽度输出

知识点:“%0md”,不足m位,高位用0补齐

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    printf("%0*d\n", n, m);
    return 0;
}

// 此处星号表示宽度(即补0个数)将由参数n提供

008:  计算地球上两点距离

西工大noj(C/C++)100题参考题解及注意事项(2024)

西工大noj(C/C++)100题参考题解及注意事项(2024)

需要注意的点:

1.math.h库里的三角函数的参数均为弧度制,而题目要求的输入的经纬度是角度,需要乘pi/180

2.样例输出里有km单位,所以printf里也要带上km

3.cos(pi)=  -1, arccos(-1)= pi。 const double pi = acos(-1); //用这句来提供pi的精确值

#include 
#include   // 包含三角函数计算
const double pi = acos(-1); // pi 值
const double t = pi / 180.0; // 用于将角度转换为弧度的常量
// 计算 haversine 函数
double hav(double theta){
    double h = (1.0 - cos(theta)) / 2.0;
    return h;
}
int main(){
    double lat1, lon1, lat2, lon2;  // 分别表示两点的纬度和经度
    const double r = 6371.0;  // 地球半径,单位为公里
    double d;
    // 输入两点的经纬度(以度为单位)
    scanf("%lf %lf", &lat1, &lon1);
    scanf("%lf %lf", &lat2, &lon2);
    // 将经纬度转换为弧度
    lat1 *= t;
    lon1 *= t;
    lat2 *= t;
    lon2 *= t;
    // 使用 Haversine 公式计算球面距离
    double hav_lat = hav(lat2 - lat1);  // 纬度差的 haversine
    double hav_lon = hav(lon2 - lon1);  // 经度差的 haversine
    d = 2 * r * asin(sqrt(hav_lat + cos(lat1) * cos(lat2) * hav_lon));  // 计算距离
    // 输出距离,保留4位小数
    printf("%.4lfkm", d);
    return 0;
}

009:风寒指数 

西工大noj(C/C++)100题参考题解及注意事项(2024)

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
#include 
int main(){
    double v,t;
    scanf("%lf %lf",&v,&t);
    double result=13.12+0.6215*t-11.37*pow(v,0.16)+0.3965*t*pow(v,0.16);
    printf("%.0lf",result);
}

按照公式编写代码即可,这里涉及到了pow(底数,指数)函数的使用

另外%.0lf表示保留到整数位,%.lf保留小数点后一位, %.mf保留小数点后m位

注意,%.mf不会改变存储在参数中的值,只是在输出的时候四舍五入后显示在屏幕上(有的参考书中认为是“四舍六入五成双”(视编译器而定),在大物实验中要用到,统计学中的银行家舍入法)

四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则。这里“四舍”是指≤4时舍去,“六入”是指≥6时进上,“五成双”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。

若想改变参数的值以便在后续使用,可以利用round(double x)函数(四舍五入到整数位),

需注意printf时要用%.0lf或使用%d和(int)x进行强制类型转换

#include 
#include 
int main(){
    double v,t;
    scanf("%lf %lf",&v,&t);
    double result=13.12+0.6215*t-11.37*pow(v,0.16)+0.3965*t*pow(v,0.16);
    result = round(result);
    printf("%d",(int)result);
}

010:颜色模型转换

西工大noj(C/C++)100题参考题解及注意事项(2024) 西工大noj(C/C++)100题参考题解及注意事项(2024)

 这里需要注意的东西不多,记住fmax和fmin两个math库函数即可,参数只能是两个。

#include 
#include 
#include 
int main()
{
    double H, S, V, MIN, MAX;
    double R, G, B;
    
    scanf("%lf %lf %lf", &R, &G, &B);
    R = R * 100.0; G = G * 100.0; B = B * 100.0;
    V = fmax(R, G);
    V = fmax(V, B);
    MAX = V;
    V = MAX / 255.0;
    MIN = fmin(R, G);
    MIN = fmin(MIN, B);
    if (V == 0) {
        S = 0;
    } else {
        S = 100.0 * (MAX - MIN) / MAX;
    }
    if (MAX == R) {
        H = 0 + 60.0 * ((G - B) / (MAX - MIN));
    } else if (MAX == G) {
        H = 120.0 + 60.0 * ((B - R) / (MAX - MIN));
    } else if (MAX == B) {
        H = 240.0 + 60.0 * ((R - G) / (MAX - MIN));
    }
    if (H  

011:  操作数(各位数字之和)

这里使用while循环比for循环更直观,更容易编写。

#include 
long long solve(long long n){
    long long result = 0;
    while(n>0){
        result = result + n%10;
        n=n/10;
    }
    return result;
}
int main(){
    long long  n;
    scanf("%lld", &n);
    long long  num=0;
    while(n>0){
        n=n-solve(n);
        num++;
    }
    printf("%lld\n", num);
}

012:方阵

西工大noj(C/C++)100题参考题解及注意事项(2024)

#include 
int main(){
    long long n,k,j;
    scanf("%lld",&n);
    if(n==0){
        printf("0\n");
    }
    else{
    for(long long i=0;i0;k--){
            printf("%lld ",k);// 如j循环,对称打印
        }
        for(j=0;j{0,1},{1,0}};
void calculate(int x,int y){
    //printf("x: %d y: %d\n",x,y);
    if(x==bx&&y==by){
        sum++;
        return ;
    }
    else{
        for(int i=0;i
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码