西工大noj100题
说在前面:所有程序设计题目的题解都是在自己思考过以后看才能有所收获,题解只是一个参考,看懂思路后最好自己从0开始敲一遍!!!
持续更新~
更新时间:2024.10.14
目录
1-10
11-20
001:Hello World
#include<stdio.h>
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.输入输出不注意大小写,回车,空格等问题
……
总之,以上这些低级错误希望同学们在考试的时候注意检查,有时候编译错误只是因为这些小错。
002:A+B
这里注意要养成良好的变成习惯,每个参数的命名都要有实际意义,比如这里的“和”命名为“sum”,而不要abcdefg这样随意地取参数,这样不仅会降低代码的可读性,有时也会使我们在编写代码的过程中忘记参数的含义,影响思路。
#include <stdio.h>
int main()
{
int a,b,sum;
scanf("%d %d", &a, &b);
sum = a + b;
printf("%d\n", sum);
return 0;
}
003:数据类型大小及范围
注意内存大小是以字节为单位的,比如int对应4字节,所以sizeof(int)= 4,其中sizeof()是反映参数对应数据类型所占的内存大小。
特别地,由于char字符类型只占1字节,所以sizeof()也可以用来求字符数组的大小
这里还需要注意区分sizeof()和 strlen()的区别:
代码示例:
char str[] = "Hello";
printf("strlen: %lu\n", strlen(str)); // 5
printf("sizeof: %lu\n", sizeof(str)); // 6 (因为包含 '\0')
参考题解1:(利用sizeof(),推荐)
#include <stdio.h>
#include <limits.h>
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<stdio.h>
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:平均值
#include <stdio.h>
#include <stdlib.h>
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,防止数据溢出。
如果有兴趣了解更多知识,这里给大家推荐一个网站:
另外,如果坚持要使用int的话,建议使用公式:c = a + (b - a)/2;
因为noj提供的测试样例最多只允许一次误差(整型数据类型强行取整,去除小数部分)
005:进制转换
基础知识回顾: %X(十六进制大写),%x(十六进制小写), %o(八进制)
#include <stdio.h>
int main(){
unsigned int n;
scanf("%d", &n);
printf("%X,%o", n, n);
return 0;
}
// 这里其实最好来说“%d”应该替换为“%u”,更为严谨。
006:浮点数输出
#include <stdio.h>
int main(){
double n;
scanf("%lf", &n);
printf("%.6lf,%.2lf,%.8lf", n, n, n);
return 0;
}
007:动态宽度输出
知识点:“%0md”,不足m位,高位用0补齐
#include <stdio.h>
int main() {
int m, n;
scanf("%d %d", &m, &n);
printf("%0*d\n", n, m);
return 0;
}
// 此处星号表示宽度(即补0个数)将由参数n提供
008: 计算地球上两点距离
需要注意的点:
1.math.h库里的三角函数的参数均为弧度制,而题目要求的输入的经纬度是角度,需要乘pi/180
2.样例输出里有km单位,所以printf里也要带上km
3.cos(pi)= -1, arccos(-1)= pi。 const double pi = acos(-1); //用这句来提供pi的精确值
#include <stdio.h>
#include <math.h> // 包含三角函数计算
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:风寒指数
#include <stdio.h>
#include <math.h>
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 <stdio.h>
#include <math.h>
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:颜色模型转换
这里需要注意的东西不多,记住fmax和fmin两个math库函数即可,参数只能是两个。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
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 < 0) {
H = H + 360.0;
}
printf("%.4lf, %.4lf%%, %.4lf%%\n", H, S, V);
}
011: 操作数
这里使用while循环比for循环更直观,更容易编写。
#include <stdio.h>
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);
}