赞
踩
更新此篇更多是用作自己记录,展现小白真实成长过程,顺便给大家提供小白版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。
- #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。
- #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)。
- #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)(已获授权)
- #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的截断,来成功输出。
这题有问题,应该是180°,不知道AC咋判的,我选择直接cv...
- #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。
- #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));
- }
- #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;
- }
- #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;
- }
- #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;
- }
- #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吧。总数取模等于各因子取模的积取模。
- #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站即可,可以把快速幂一起看了,不懂没关系,先记住吧(还好考实验可以带纸质资料...)
- # 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真的很奇怪...这才第二十个题,明明章节标题还是循环,就得用到数组了(不过我也不知道有没有不用数组就能解决的方法...)。去看翁恺老师数组那几节就完事
- #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就行。)
这题略过,大佬代码感觉挺清楚的。(好吧其实是太麻烦我直接放弃...)
- #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;
- }
- #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);
- }
- #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又可以...这是为啥,有无大佬解答一下,感恩
- #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等等。
复杂...不懂...先行放弃。直接循环求阶乘去找会越界,但是只要加入考虑k是质数的时候N即为k的情况就AC了,不放代码了就(源cv...)。估计是样例里有个挺大的质数,但也仅限于此了。考试的时候尽己所能写得了...
- #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(方便大家看,截了过来,也可以去看看大佬的其他题。)(已获授权)
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可供突击用()
- #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;
- }
- #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;
- }
- #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;
- }
前三题都是知道定义函数就行,挺简单的。
- #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。
- #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就好了。
- #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输入字符串不需要&,直接用数组名。
我的思路很直接,就左右两边分开处理,左边用的冒泡排序,右边对调。
- #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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。