西北工业大学2023C语言noj小白部分解答版

更新此篇更多是用作自己记录,展现小白真实成长过程,顺便给大家提供小白版noj解题代码()

感恩大佬指导!!

前几题略过了,可以去看大佬代码。

大佬代码可参见http://t.csdnimg.cn/mcBo7,还有其他大佬也在更,可以自己搜到,只与这位大佬有交流(已获授权),所以这里只提到这位佬。还可以去康康这位佬更新的noj易错总结https://annesede.github.io/p/nojc%E6%98%93%E9%94%99%E6%80%BB%E7%BB%93/

提醒:小白切记检查基础错误,比如用scanf有无&,{ }的位置,定义的数据类型与printf输出类型是否对应......一定要学调试!上手还挺简单的,目前我个人感觉来说,知道加断点,下一列,看窗口就ok。

8.计算地球上两点之间的距离

3dd4d7f930fd4e3b87beb4729a6ec7da.png

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

const double p=3.1415926;
double hav(double j)
{
    return j=(1-cos(j))/2.0;
}
double hu(double jiao)
{
    return jiao=jiao/180.0*p;
}
int main()
{
   double w1,j1,w2,j2,y;
   scanf("%lf %lf",&w1,&j1);
   scanf("%lf %lf",&w2,&j2);
   w1=hu(w1);
   j1=hu(j1);
   w2=hu(w2);
   j2=hu(j2);
   y=hav(w2-w1)+cos(w1)*cos(w2)*hav(j2-j1);
   y=acos(1-2*y)*6371;
   printf("%.4lfkm",y);
   return 0;
}

8.9.10.这三题知道定义函数,调用函数之类就OK。使用cos,pow等函数时头文件记得加math.h,cb对该错误不报错,提交noj会显示ce。

9.计算寒意指数

12d9a7253288475890078d9c9f03de3e.png

#include <stdio.h>
#include<math.h>

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

这题要注意四舍五入,直接做类型转换会截断,可以像我这样用%.0lf解决,也可以用wc=(int)(wc+0.5)。

10.颜色模型转换
3989398fcbf740dd9735379e96caa51f.png
#include <stdio.h>
#include <stdlib.h>

double max(double a,double b,double c)
{   double d;
    if(a>=b){
        if(a>=c)d=a;
        else d=c;
    }
    else{if(b>=c)d=b;
        else d=c;
    }
    return d;
}
double min(double a,double b,double c)
{   double d;
    if(a<=b){
        if(a<=c)d=a;
        else if(c<=b)d=c;
    }
    else{
        if(b<=c)d=b;
        else if(c<=a)d=c;
    }
    return d;
}
int main()
{
    double R,G,B,H,S,V,v;
    scanf("%lf%lf%lf",&R,&G,&B);
    R/=255;
    G/=255;
    B/=255;
    V=max(R,G,B);
    if(V==0)S=0;
    else {
    v=min(R,G,B);
    S=(V-v)/V;
    }
    if(V==R)H=60*(G-B)/(V-v);
    if(V==G)H=60*(2+(B-R)/(V-v));
    if(V==B)H=60*(4+(R-G)/(V-v));
    if(H<0)H+=360;
    printf("%.4lf,%.4lf%%,%.4lf%%",H,S*100,V*100);
    return 0;
}

这题一开始真...,根本没看懂字节值是啥......后来有大佬告诉我直接除以255就行,因为R,G,B取值范围是0-1,输入是0-255。

然后注意printf是怎样输出%的,要用%%。(第一个%会被判定为引导符,用于引导输出项的格式,只有一个%会被认为是没加输出类型,而不会打印% 。)(详可参见http://t.csdnimg.cn/5xELA)(已获授权)

11.级数和

#include <stdio.h>
#include <math.h>

double a(int n)
{
    double m,s;
    m=n+1;
    while(floor(m)){
        m/=10.0;
    }
    s=m+n;
    return s;
}
int main(){
    int n=1,k;
    double an,sum;
    scanf("%d",&k);
    while(n<k){
        an=a(n);
        printf("%g+",an);
        sum+=an;
        n+=1;
    }
    an=a(n);
    sum+=an;
    printf("%g=%g",an,sum);
    return 0;
}

这题要知道floor函数(来源于math.h,所以用这个也要记得加头文件):向下取整,即取不大于x的最大整数,数学里的取整函数【x】。用floor函数实现小数部分的输出。

把输出放进while循环,用%g实现小数点后尾部0的截断,来成功输出。

12.对称数

这题有问题,应该是180°,不知道AC咋判的,我选择直接cv...

13.比率

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

long long gys(long long a,long long b){
    if(b==0)return a;
    else return gys(b,a%b);
}

int cou(double x){
    int m=0;
    while(x!=floor(x)) {
            x*=10;
            m++;
    }
    return m;
}

int main()
{
    double x;
    long long c,m,g,d;
    scanf("%lf",&x);
    m=cou(x);
    c=pow(10,m);
    g=fabs(gys(x*c,c));
    d=x*c/g;
    c/=g;
    printf("%lld/%lld",d,c);
    return 0;
}

第一个难题就是怎么把任意小数化为整数,可以直接乘一个很大的数,比如1000000...,也可以用floor来解决(这玩意还挺好用,赞喔)。然后要知道用辗转相除法求最大公约数。

这题还要注意考虑负数,如果不用fabs,输入为负数,比如-4.2时,会输出21/-5(不过我也不知道不考虑会不会算AC...);但是数据范围是一定要考虑的,我一开始用int显示WA,改为long long才AC。

14.分数的加、减、乘、除

#include <stdio.h>
#include <stdlib.h>

long long gcd(long long a,long long b)
{
    if(b)return gcd(b,a%b);
    else return a;
}
int main()
{   long long a,b,c,d;
    scanf("%lld/%lld",&a,&b);
    scanf("%lld/%lld",&c,&d);
    printf("(%lld/%lld)+(%lld/%lld)=%lld/%lld\n",a,b,c,d,(a*d+b*c)/gcd(a*d+b*c,b*d),b*d/gcd(a*d+b*c,b*d));
    printf("(%lld/%lld)-(%lld/%lld)=%lld/%lld\n",a,b,c,d,(a*d-b*c)/gcd(a*d-b*c,b*d),b*d/gcd(a*d-b*c,b*d));
    printf("(%lld/%lld)*(%lld/%lld)=%lld/%lld\n",a,b,c,d,(a*c)/gcd(a*c,b*d),b*d/gcd(a*c,b*d));
    printf("(%lld/%lld)/(%lld/%lld)=%lld/%lld\n",a,b,c,d,(a*d)/gcd(a*d,b*c),b*c/gcd(a*d,b*c));
}
15.操作数

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

long long sum(long long x)
{   long long a,s=0;
    while(floor(x))
    {
        a=x%10;
        s+=a;
        x/=10;
    }
    return s;
}
int main()
{
    long long x,n=0,count=1;
    scanf("%lld",&x);
    while(x-n)
    {
        n=sum(x);
        x-=n;
        count++;
    }
    printf("%lld",count);
    return 0;
}

16.方阵

#include <stdio.h>
 
int main(){
    int n,m;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            m = (i-j) > 0 ? (i-j) : (j-i);
            printf("%d ",m);
        }
        printf("\n");
    }
    return 0;
}

17.组合数

#include <stdio.h>
#include <stdlib.h>

int main()
{   int n,a,b,c,d,m=0,count=0;
    scanf("%d",&n);
    for(a=0;a<=9;++a){
        for(b=0;b<=9;++b){
            for(c=0;c<=9;++c){
                    for(d=0;d<=9;++d){
                        m=a+b+c+d;
                        if(n==m)count++;
                    }
            }
        }
    }
    printf("%d",count);
    return 0;
}

18.乘数模

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long a,b,m,c;
    scanf("%lld%lld%lld",&a,&b,&m);
    c=((a%m)*(b%m))%m;
    printf("%lld",c);
    return 0;
}

我是先做完幂数模才做的乘数模(noj每章节出题顺序应该是随机的,对大佬应该没差,对我这种...so友情提示各位不会可以先往后面看几题,可能简单些),不知道这题要不要考虑溢出那些,保险还是用(a*b)mod m=(a mod m)*(b mod m)mod m吧。总数取模等于各因子取模的积取模。

19.幂数模

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

int main()
{
    unsigned long long a,b,c,d=1;
    scanf("%llu%llu%llu",&a,&b,&c);
    while(b!=0){
        if(b&1)d=(d*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    printf("%llu",d);
    return 0;
}

要用快速幂模,去看b站即可,可以把快速幂一起看了,不懂没关系,先记住吧(还好考实验可以带纸质资料...)

20.倍数和

# include <stdio.h>

int sum(int b){
    int sum=0;
    for(int n=1;n<b;n++){
        if(n%3==0||n%5==0)sum+=n;
    }
    return sum;
}

int main(){
    int n,b,c,i=0;
    scanf("%d",&n);
    int s[n];
    c=n;
    while(c){
         scanf("%d",&b);
         s[i]=sum(b);
         i++;
         c--;
    }
    i=0;
    while(i+1<=n){
         printf("%d\n",s[i]);
         i++;
    }
    return 0;
}

不得不说,你瓜noj真的很奇怪...这才第二十个题,明明章节标题还是循环,就得用到数组了(不过我也不知道有没有不用数组就能解决的方法...)。去看翁恺老师数组那几节就完事

21.好数字

#include <stdio.h>
#include<math.h>

int main(){
    long long n,sum=1,m=pow(10,9)+7;
    scanf("%lld",&n);
    while(n){
        if(n%2!=0)sum=(5*sum)%m;
        else sum=(4*sum)%m;
        n--;
    }
    printf("%lld",sum%m);
    return 0;
}

这题要注意C语言数数是从0开始数起的,比如4562,从左到右分别是第0位、第一位、第二位、第三位。所以长度为1的好数字总数实际就是看个位偶数有几个,0、2、4、6、8,五个,输出为5。

奇数位是4个素数,所以这题实质就是个累乘问题。N=1时,总数为5;N=2时,总数为5*4;N=3时,总数为5*4*5......而此题还要求取模,又要用到乘数模(见18题)。

(这里如果用宏定义m,#define m (pow(10,9)+7),pow是double型,m会被记成double型,取余运算错误。改成#define m 1000000007就行。)

22.竖式计算

这题略过,大佬代码感觉挺清楚的。(好吧其实是太麻烦我直接放弃...)

23.查找数列

#include <stdio.h>
#include <stdlib.h>

int main()
{   long long n,a;
    scanf("%lld",&n);
    for(a=1;n>a+1;a++)n-=a;
    printf("%lld",n);
    return 0;
}

24.余数和

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long k,n,i,sum=0;
    scanf("%lld%lld",&n,&k);
    for(i=1;i<=n;i++){
        sum+=k%i;
    }
    printf("%lld",sum);
}

25.毕达哥拉斯三元组

#include <stdio.h>
#include <stdlib.h>

int main()
{   int a,b,c,n,f=0;
    scanf("%d",&n);
    for(a=1;a<=n;a++){
        for(b=a;b<=n;b++){
            c=n-a-b;
            if(c>b&&a*a+b*b==c*c){
                    f=1;break;
            }
        }
        if(f==1)break;
    }
    printf("%d",a*b*c);
    return 0;
}

学到了怎么控制嵌套for循环都break...

这题奇怪的在于用int给过,long long不行,unsigned long long又可以...这是为啥,有无大佬解答一下,感恩

26.俄罗斯农夫乘法

#include <stdio.h>
#include <stdlib.h>

int sum(int a,int b){
    int sum=0;
    if(a==0||b==0)return 0;
    if(a==1)return b;
    printf("%d %d\n",a,b);
    while(a!=1){
        if(a%2!=0)sum+=b;
        a/=2;b*=2;
        printf("%d %d\n",a,b);
    }
    sum+=b;
    return sum;
}
int main()
{
    int a,b,s=0;
    scanf("%d%d",&a,&b);
    s=sum(a,b);
    printf("%d",s);
    return 0;
}

这题是真奇怪+恶心啊,也没说清楚a=0时如何输出,测试发现a=0或者b=0时不打印a,b,直接输出sum才行,什么狗东西......

做题记得考虑特殊情况,a=0,a=1等等。

27.阶乘倍数

复杂...不懂...先行放弃。直接循环求阶乘去找会越界,但是只要加入考虑k是质数的时候N即为k的情况就AC了,不放代码了就(源cv...)。估计是样例里有个挺大的质数,但也仅限于此了。考试的时候尽己所能写得了...

28.方案数

#include <stdio.h>
#include <stdlib.h>

int main()
{   long long n,cnt=0,i;
    scanf("%lld",&n);
    for(i=1;((i*i-i)/2)<n;i++){
        if((n-(i*i-i)/2)%i==0)cnt++;
    }
    printf("%lld",cnt);
    return 0;
}

这题这位大佬讲的很清楚,不多说哩。http://t.csdnimg.cn/rVFNb(方便大家看,截了过来,也可以去看看大佬的其他题。)(已获授权)

29.最大数字

RE:

#include <stdio.h>
#include <stdlib.h>

int m(int N){
    int a=0,b=0,c;
    for(c=N;c/10;c/=10){
        a=(c/10)%10;
        b=c%10;
        if(a>b)break;
    }
    if(a>b)return m(--N);
    else return N;
}
int main()
{   int N,n;
    scanf("%d",&N);
    n=m(N);
    printf("%d",n);
    return 0;
}

老师帮忙改了下后的AC代码:

#include <stdio.h>

int maxNumber(int N)
{
    int a=0,b=10,c,m;

    for(m=N; m>=0; m--)
    {
        b=10;
        for(c=m; c!=0; c/=10)
        {
            a=c%10;
            if(a>b)
                break;
            else
                b=a;
        }
        if(a<=b)
            return m;
    }
    return m;
}

int main()
{
    int N,n;
    scanf("%d",&N);
    n=maxNumber(N);
    printf("%d",n);
    return 0;
}

我的思路是从N开始检查,依次递减,直到检查到符合题意的数字。感觉没啥问题()但提交就是RE,老师说可能是因为我用的递归,测试样例中有非常大的数,导致递归层次很深,栈溢出了。把递归改成循环应该就不会溢出了。(关于栈,有学长说:机器在调用函数时程序会进入一个与主程序截然不同的环境运行,为了实现两个环境之间交互(返回值,参数)系统有一个自带的数据结构栈来存储这些数据,计算机里不存在无限这个概念,所以栈的大小也是固定的,当函数调用的次数比栈的大小大时,栈就溢出了。)

给出考试模拟题小白版解答,maybe可供突击用()

91.【IO】气体扩散
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    double m,n,a;
    scanf("%lf%lf",&m,&n);
    a=sqrt(n/m);
    printf("%.4lf",a);
    return 0;
}
92.【递归】阿克曼数
#include <stdio.h>
#include <stdlib.h>

int A(int m,int n){
    if(m==0)return n+1;
    if(n==0)return A(m-1,1);
    else return A(m-1,A(m,n-1));
}
int main()
{
    int m,n,c;
    scanf("%d%d",&m,&n);
    c=A(m,n);
    printf("%d",c);
    return 0;
}
93.【循环】圆周率
#include <stdio.h>

double pai(long long n){
    double sum=3,a;
    while(n-1){
        a=4.0/((2*n-2)*(2*n-1)*(2*n));
        if(n%2==0)sum+=a;
        else sum-=a;
        --n;
    }
    return sum;
}
int main(){
	long long n;
	double sum;
	scanf("%lld",&n);
	sum=pai(n);
	printf("%.7lf",sum);
	return 0;
}

前三题都是知道定义函数就行,挺简单的。

94.【数组】重复元素
#include <stdio.h>

int main(){
	int a[100007];
	int n,i,j,cnt=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        for(j=0;j<i;j++){
            if(a[i]==a[j]){
                    cnt++;
                    break;
            }
        }
	}
	printf("%d",cnt);
	return 0;
}

这题我给出的代码思路就是每输入一个数据,都从a[0]开始与数组已有数据比较,找到相同的就cnt++,要注意找到一个后就要break,不然就会重复多记。比如1 3 1 1,没有break的话,输入第三个1时,cnt会+2而非+1。

95.【选择】马赫数
#include <stdio.h>
#include <math.h>
double c(double t){
    return 331.3*sqrt(1+t/273.15);
}
int main(){
	double v,t,M;
	scanf("%lf%lf",&v,&t);
	M=(v/3.6)/c(t);
	if(M-0.8<1e-6)printf("%.3lf subsonic",M);
	else if(M-1.2<1e-6)printf("%.3lf transonic",M);
	else if(M-5.0<1e-6)printf("%.3lf supersonic",M);
	else printf("%.3lf hypersponic",M);
	return 0;
}

这题也没啥好说的,就定义函数,然后用if就好了。

96.【字符串】左右操作
#include <stdio.h>
#include <string.h>
int main(){
	char a[1000];
	int i,j,n,m;
	scanf("%s",a);
	n=strlen(a);
	for(i=0;i<(n/2);i++){
        for(j=0;j<(n/2-i);j++){
            if(a[j]<a[j+1]){
                char t;
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
	}
	if(n%2==0)m=n/2;
	else m=n/2+1;
	for(i=m,j=0;j<n/4;i++,j++){
        char t;
        t=a[i];
        a[i]=a[n-j-1];
        a[n-j-1]=t;
	}
	printf("%s",a);
	return 0;
}

这题首先要知道字符串的输入输出。注意用%s输入字符串不需要&,直接用数组名。

我的思路很直接,就左右两边分开处理,左边用的冒泡排序,右边对调。

97.【算法】零钞

#include <stdio.h>

int main()
{
    int n,a,b,c,d;
	scanf("%d",&n);
	a=n/10;
	b=(n-a*10)/5;
	c=(n-a*10-b*5)/2;
	d=n-a*10-b*5-c*2;
	if(d)printf("1=%d\n",d);
	if(c)printf("2=%d\n",c);
	if(b)printf("5=%d\n",b);
	if(a)printf("10=%d\n",a);
	return 0;
}

  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
西北工业大学NOJC程序设计习题答案(非本人制作,侵删) 1.“1“的传奇 2.A+B 3.A+BⅡ 4.AB 5.ACKERMAN 6.Arithmetic Progressions 7.Bee 8.Checksum algorithm 9.Coin Test 10.Dexter need help 11.Double 12.Easy problem 13.Favorite number 14.Graveyard 15.Hailstone 16.Hanoi Ⅱ 17.Houseboat 18.Music Composer 19.Redistribute wealth 20.Road trip 21.Scoring 22.Specialized Numbers 23.Sticks 24.Sum of Consecutive 25.Symmetric Sort 26.The Clock 27.The Ratio of gainers to losers 28.VOL大学乒乓球比赛 29.毕业设计论文打印 30.边沿与内芯的差 31.不会吧,又是A+B 32.不屈的小蜗 33.操场训练 34.插入链表节点 35.插入排序 36.插入字符 37.成绩表计算 38.成绩转换 39.出租车费 40.除法 41.创建与遍历职工链表 42.大数乘法 43.大数除法 44.大数加法 45.单词频次 46.迭代求根 47.多项式的猜想 48.二分查找 49.二分求根 50.发工资的日子 51.方差 52.分离单词 53.分数拆分 54.分数化小数 55.分数加减法 56.复数 57.高低交换 58.公园喷水器 59.韩信点兵 60.行程编码压缩算法 61.合并字符串 62.猴子分桃 63.火车站 64.获取指定二进制位 65.积分计算 66.级数和 67.计算A+B 68.计算PI 69.计算π 70.计算成绩 71.计算完全数 72.检测位图长宽 73.检查图像文件格式 74.奖金发放 75.阶乘合计 76.解不等式 77.精确幂乘 78.恐怖水母 79.快速排序 80.粒子裂变 81.链表动态增长或缩短 82.链表节点删除 83.两个整数之间所有的素数 84.路痴 85.冒泡排序 86.你会存钱吗 87.逆序整数 88.排列 89.排列分析 90.平均值函数 91.奇特的分数数列 92.求建筑高度 93.区间内素数 94.三点顺序 95.山迪的麻烦 96.删除字符 97.是该年的第几天 98.是该年的第几天? 99.数据加密 100.搜索字符 101.所有素数 102.探索合数世纪 103.特殊要求的字符串 104.特殊整数 105.完全数 106.王的对抗 107.危险的组合 108.文件比较 109.文章统计 110.五猴分桃 111.小型数据库 112.幸运儿 113.幸运数字”7“ 114.选择排序 115.寻找规律 116.循环移位 117.延伸的卡片 118.羊羊聚会 119.一维数组”赋值“ 120.一维数组”加法“ 121.勇闯天涯 122.右上角 123.右下角 124.圆及圆球等的相关计算 125.圆及圆球等相关计算 126.程序员添加行号 127.找出数字 128.找幸运数 129.找最大数 130.整数位数 131.重组字符串 132.子序列的和 133.子字符串替换 134.自然数立方的乐趣 135.字符串比较 136.字符串复制 137.字符串加密编码 138.字符串逆序 139.字符串排序 140.字符串替换 141.字符串左中右 142.组合数 143.最次方数 144.最大乘积 145.最大整数 146.最小整数 147.最长回文子串 148.左上角 149.左下角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒芒律师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值