当前位置:   article > 正文

西工大新版C语言NOJ_动态宽度输出西南工大

动态宽度输出西南工大

目录

1、Hello World

2、A+B

3、数据类型大小及范围

4、平均值

5、进制转换

6、浮点数输出

7、动态宽度输出

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

9、风寒指数

10、颜色模型转换

12、分数的加、减、乘、除法

13、组合数

14、乘数模

15、比率

17、倍数和

18、方阵

19、操作数

20、级数和

22、俄罗斯农夫乘法

23、方案数

24、余数和

25、毕达哥拉斯三元组

27、竖式乘法

28、最大数字

29、查找数列

33、冰雹序列

34、可变参数平均

35、可变参数累加

36、基思数

38、佩尔数

39、哈沙德数

40、素数

48、回文数和


1、Hello World

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. printf("Hello World\n");
  6. return 0;
  7. }

2、A+B

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a,b,c;
  6. scanf("%d %d",&a,&b);
  7. c=a+b;
  8. printf("%d",c);
  9. return 0;
  10. }

3、数据类型大小及范围

本题纯纯水题,繁琐的要死。不过通过本题可以学会sizeof()的用法还有_MIN和_MAX的用法。

注意要点:

1、无符号类型的数据最小值是0,可以直接输出。

2、要注意printf中引号内部和外部的字符类型得一一对应。

3、除了用if语句的话还可以用switch语句,感觉更为方便。

  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main()
  4. {
  5. int a;
  6. scanf("%d",&a);
  7. if(a==1) printf("%d,%d,%d",sizeof(char),CHAR_MIN,CHAR_MAX);
  8. if(a==2) printf("%d,0,%u",sizeof(unsigned char),UCHAR_MAX);
  9. if(a==3) printf("%d,%d,%d",sizeof(short),SHRT_MIN,SHRT_MAX);
  10. if(a==4) printf("%d,0,%u",sizeof(unsigned short),USHRT_MAX);
  11. if(a==5) printf("%d,%d,%d",sizeof(int),INT_MIN,INT_MAX);
  12. if(a==6) printf("%d,0,%u",sizeof(unsigned int),UINT_MAX);
  13. if(a==7) printf("%d,%ld,%ld",sizeof(long),LONG_MIN,LONG_MAX);
  14. if(a==8) printf("%d,0,%lu",sizeof(unsigned long),ULONG_MAX);
  15. if(a==9) printf("%d,%lld,%lld",sizeof(long long),LLONG_MIN,LONG_MAX);
  16. if(a==10) printf("%d,0,%llu",sizeof(unsigned long long),ULONG_MAX);
  17. return 0;
  18. }

4、平均值

注意本题得用long long int的类型!!!int类型的字节过不了!!!(导致我交了5次才过!!!)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long long int a,b,c;
  6. scanf("%lld %lld",&a,&b);
  7. c=(a+b)/2;
  8. printf("%lld",c);
  9. return 0;
  10. }

5、进制转换

通过本题可以学会在我们输出时如何进行进制转换。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a;
  6. scanf("%d",&a);
  7. printf("%X,%o",a,a);
  8. return 0;
  9. }

6、浮点数输出

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. double a;
  6. scanf("%lf",&a);
  7. printf("%.6lf,%.2lf,%.8lf",a,a,a);
  8. return 0;
  9. }

7、动态宽度输出

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long long m,n,a;
  6. int w=0;
  7. scanf("%lld %lld",&m,&n);
  8. a=m;//获取m的位数
  9. while(a!=0)
  10. {
  11. w++;
  12. a=a/10;
  13. }
  14. if(n>w)
  15. {
  16. for(int i=1;i<=(n-w);i++)
  17. {
  18. printf("0");
  19. }
  20. printf("%lld",m);
  21. }
  22. else
  23. {
  24. printf("%d",m);
  25. }
  26. return 0;
  27. }

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

本题要注意进行弧度制的转化。

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define PI 3.1415926535
  4. int main()
  5. {
  6. double x,y,m,n,a,b,h,d,r=6371;
  7. scanf("%lf %lf\n%lf %lf",&x,&y,&m,&n);
  8. x=x*PI/180;
  9. y=y*PI/180;
  10. m=m*PI/180;
  11. n=n*PI/180;
  12. a=(1-cos(x-m))/2;
  13. b=(1-cos(y-n))/2;
  14. h=a+cos(x)*cos(m)*b;
  15. d=(acos(1-2*h))*r;
  16. printf("%.4lfkm",d);
  17. return 0;
  18. }

9、风寒指数

本题能够学会round函数,其主要作用是对数值进行四舍五入的操作。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. double v,T,c;
  6. double a;
  7. scanf("%lf %lf",&v,&T);
  8. a=pow(v,0.16);
  9. c=13.12+0.6215*T-11.37*a+0.3965*T*a;
  10. c=round(c);//对于数值进行四舍五入。
  11. printf("%.0lf",c);
  12. return 0;
  13. }

10、颜色模型转换

当时写的时候感觉写的有点不整齐,所以就format了一下,导致程序变得很长,不过还是很好理解的,而代码中的255的数据是可以从网上自行查询。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. double r,g,b,a,c,v,s,h;
  6. scanf("%lf %lf %lf",&r,&g,&b);
  7. r=r/255.0;
  8. g=g/255.0;
  9. b=b/255.0;
  10. a=g;
  11. c=g;
  12. if(r>a) a=r;
  13. if(b>a) a=b;
  14. if(r<c) c=r;
  15. if(b<c) c=b;
  16. v=a*100;
  17. if(v==0)
  18. {
  19. s=0;
  20. }
  21. else
  22. {
  23. s=(a-c)/a;
  24. }
  25. s=s*100;
  26. if(a==r)
  27. {
  28. h=(0+(g-b)/(a-c))*60;
  29. }
  30. else if(a==g)
  31. {
  32. h=(2+(b-r)/(a-c))*60;
  33. }
  34. else if(a==b)
  35. {
  36. h=(4+(r-g)/(a-c))*60;
  37. }
  38. if(h<0)
  39. {
  40. h=h+360;
  41. }
  42. else
  43. {
  44. h=h;
  45. }
  46. printf("%.4lf,%.4lf%%,%.4lf%%",h,s,v);
  47. return 0;
  48. }

12、分数的加、减、乘、除法

本题还是挺繁琐的,因此调用了一个约分的函数。而对于分数的约分主要有两种方法:1、辗转相除法(其实就是从两个数中取一个数,然后通过遍历的方法依次减小来求最大公约数,然后再将两个数同时除以最大公约数就解决了!!!,本代码主要用的便是这个方法)2、更相减损术(这个方法来源于《九章算术》,可以自行查阅,本人也没太搞明白哈哈哈哈哈......)

  1. #include <stdio.h>
  2. #include <math.h>
  3. int yuefen(int e,int f)
  4. {
  5. int n;
  6. n=abs(e);
  7. for(e,f,n;n>=1;n--)
  8. {
  9. if(e%n==0&&f%n==0)
  10. break;
  11. }
  12. return n;
  13. }
  14. int main()
  15. {
  16. int a,b,c,d;
  17. int e,f;
  18. int m;
  19. scanf("%d/%d\n%d/%d",&a,&b,&c,&d);
  20. e=b*d;
  21. f=a*d+b*c;
  22. m=yuefen(e,f);
  23. if(e*f<0)
  24. { e=abs(e);
  25. f=abs(f);
  26. printf("(%d/%d)+(%d/%d)=-%d/%d\n",a,b,c,d,f/m,e/m);
  27. }
  28. else
  29. {
  30. e=abs(e);
  31. f=abs(f);
  32. printf("(%d/%d)+(%d/%d)=%d/%d\n",a,b,c,d,f/m,e/m);
  33. }
  34. e=b*d;
  35. f=a*d-c*b;
  36. m=yuefen(e,f);
  37. if(e*f<0)
  38. { e=abs(e);
  39. f=abs(f);
  40. printf("(%d/%d)-(%d/%d)=-%d/%d\n",a,b,c,d,f/m,e/m);
  41. }
  42. else
  43. {
  44. e=abs(e);
  45. f=abs(f);
  46. printf("(%d/%d)-(%d/%d)=%d/%d\n",a,b,c,d,f/m,e/m);
  47. }
  48. e=b*d;
  49. f=a*c;
  50. m=yuefen(e,f);
  51. if(e*f<0)
  52. { e=abs(e);
  53. f=abs(f);
  54. printf("(%d/%d)*(%d/%d)=-%d/%d\n",a,b,c,d,f/m,e/m);
  55. }
  56. else
  57. {
  58. e=abs(e);
  59. f=abs(f);
  60. printf("(%d/%d)*(%d/%d)=%d/%d\n",a,b,c,d,f/m,e/m);
  61. }
  62. e=b*c;
  63. f=a*d;
  64. m=yuefen(e,f);
  65. if(e*f<0)
  66. { e=abs(e);
  67. f=abs(f);
  68. printf("(%d/%d)/(%d/%d)=-%d/%d\n",a,b,c,d,f/m,e/m);
  69. }
  70. else
  71. {
  72. e=abs(e);
  73. f=abs(f);
  74. printf("(%d/%d)/(%d/%d)=%d/%d\n",a,b,c,d,f/m,e/m);
  75. }
  76. return 0;
  77. }

13、组合数

本题利用了循环嵌套,只要理解了就挺简单的。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long a,b,c,d,e,i=0;
  6. scanf("%ld",&e);
  7. for(a=0;a<=9;a++)
  8. for(b=0;b<=9;b++)
  9. for(c=0;c<=9;c++)
  10. for(d=0;d<=9;d++)
  11. if(a+b+c+d==e) i++;
  12. printf("%ld",i);
  13. return 0;
  14. }

14、乘数模

如果直接运算a*b的话会超出数据范围,因此在网上查了个计算数模的方法,就是两个数的的乘积a*b mod m=(a mod m)*(b mod m) mod m,这样的话可以防止数据超出范围。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long long a,b,m,n;
  6. scanf("%lld %lld %lld",&a,&b,&m);
  7. n=(a%m)*(b%m)%m;
  8. printf("%lld",n);
  9. return 0;
  10. }

15、比率

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. double m;
  6. int i,j,k;
  7. scanf("%lf",&m);
  8. if(m!=0)
  9. {
  10. int n=0;
  11. for(m,n,i=0;n!=m;i++)
  12. {
  13. m=m*10;
  14. n=(int)m;
  15. }
  16. int l=(int)m;
  17. k=l;
  18. for(j=1,i; i>=1; i--)
  19. j=j*10;
  20. for(j,l,k; k>=1; k--)
  21. {
  22. if(l%k==0&&j%k==0)
  23. break;
  24. }
  25. printf("%d/%d",l/k,j/k);
  26. }
  27. else printf("0");
  28. return 0;
  29. }

17、倍数和

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. unsigned int beishuhe(unsigned int i)
  4. {
  5. unsigned int j=0;
  6. i=i-1;
  7. for(i;i>=1;i--)
  8. {
  9. if(i%3==0||i%5==0)
  10. j=i+j;
  11. }
  12. return j;
  13. }
  14. int main()
  15. {
  16. long int t;
  17. scanf("%ld",&t);
  18. unsigned int j[100000];
  19. for(unsigned int n=0;n<t;n++)
  20. {
  21. unsigned int i;
  22. scanf("%u",&i);
  23. j[n]=beishuhe(i);
  24. }
  25. for(unsigned int n=0;n<t;n++)
  26. {
  27. printf("%u\n",j[n]);
  28. }
  29. return 0;
  30. }

18、方阵

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i;
  6. int j=0,m=0,n,t=0;
  7. scanf("%d",&i);
  8. for(;i>0;i--)
  9. {
  10. for(t;t>0;t--)
  11. printf("%d ",t);
  12. for(n=0;n<i;n++)
  13. printf("%d ",n);
  14. printf("\n");
  15. m++;
  16. t=m;
  17. n=j;
  18. }
  19. return 0;
  20. }

19、操作数

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int m,n=0;
  5. scanf("%d",&m);
  6. int t=0,l=0;
  7. for(int i=m;i>0;l++)
  8. {
  9. for(;m!=0;m=m/10)
  10. {
  11. n=m%10;
  12. t=t+n;
  13. }
  14. i=i-t;
  15. m=i;
  16. t=0;
  17. }
  18. printf("%d",l);
  19. return 0;
  20. }

20、级数和

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. double i=1.2;
  6. double t=12,z=12;
  7. double s=11;
  8. int m;
  9. int n=2;
  10. scanf("%d",&m);
  11. printf("%.1lf",i);
  12. for(;n<=8&&n<=m;n++)
  13. {
  14. z=z+s;
  15. t=t+z;
  16. printf("+%.1lf",z/10);
  17. }
  18. if(n==9)
  19. {
  20. printf("+9.1");
  21. n++;
  22. t=t+91;
  23. }
  24. t=t*10;
  25. z=910;
  26. s=101;
  27. for(;n>=10&&n<=m&&n<=98;n++)
  28. {
  29. z=z+s;
  30. t=t+z;
  31. printf("+%.2lf",z/100);
  32. s=101;
  33. }
  34. if(n==99)
  35. {
  36. printf("+99.100");
  37. t=t+9910;
  38. }
  39. t=t/100;
  40. printf("=%.2lf",t);
  41. return 0;
  42. }

22、俄罗斯农夫乘法

本题有个大坑!!!我当时其他数字感觉都是正确的,但是就是一直WA,最后才发现原来是当输入的第一个数字是0的时候,结果直接输出0就可以了!!!不用再输出原来的两个数。而当输入的第一个数字不是0的时候,也要注意在输出的时候要把最开始的输入的两个数字也整出来,这样才符合NOJ的输出条件。(开始也没注意到这个问题,导致一直WA),不过后来注意到了之后就直接AC了捏。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long int i,j;
  6. scanf("%ld %ld",&i,&j);
  7. long int t=0;
  8. if(i%2!=0) t=j;
  9. else t=0;
  10. if(i!=0) printf("%ld %ld\n",i,j);
  11. while(i>1)
  12. {
  13. i=i/2;
  14. printf("%ld ",i);
  15. j=j*2;
  16. printf("%ld\n",j);
  17. if(i%2!=0)
  18. t=t+j;
  19. }
  20. printf("%ld",t);
  21. return 0;
  22. }

23、方案数

循环内部的嵌套,想明白了就行。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int j,i=0;
  6. int t=1,n=0,m=0;
  7. scanf("%d",&j);
  8. for(;j>=1;j--)
  9. {
  10. for(;t<=j;t++)
  11. {
  12. int k=t;
  13. for(;k<=j;k++)
  14. {
  15. m=m+k;
  16. if(m==j) i++;
  17. }
  18. if((k-1)==j)
  19. {
  20. m=0;
  21. }
  22. }
  23. }
  24. printf("%d",i);
  25. return 0;
  26. }

24、余数和

很简单的一道题,看代码应该就看得懂了。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i,j;
  6. int t=0;
  7. scanf("%d %d",&i,&j);
  8. for(;i>=1;i--)
  9. {
  10. t=t+(j%i);
  11. }
  12. printf("%d",t);
  13. return 0;
  14. }

25、毕达哥拉斯三元组

本题得优化算法,如果让三个变量都遍历去求的话会TE超时,因此我们首先可以通过三者变量之和为一个定值,这样的话只用遍历两个变量即可求出第三个变量的值。还有就是如果a*a+b*b=c*c的话那么c一定不可能与a,b两个值相等,而且一旦我们所输入的n的值大于二之后,那么a,b,c的值都不可能超过n/2,因此可进一步减少遍历次数防止TE超时错误。代码如下:

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. unsigned long long i=1,j=1,m=1,n;
  6. unsigned long long k=0;
  7. scanf("%llu",&n);
  8. for(; i<=(n/2); i++)
  9. for(j=i; j<=(n/2); j++)
  10. {
  11. m=n-i-j;
  12. if(i*i+j*j==m*m&&i+j+m==n)
  13. {
  14. k=i*j*m;
  15. printf("%llu\n",k);
  16. break;
  17. }
  18. }
  19. return 0;
  20. }

27、竖式乘法

此题思路还是挺简单的,就是步骤有点点繁琐,而且有一些小的细节需要去注意,本人当时写的时候脑子昏特了,定义的变量太多,还望见谅。不过代码可以AC,其实也可以优化所定义的变量的字母的个数从而看起来更方便。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int quwei(int x)
  4. {
  5. int m=x;
  6. int k=0;
  7. while(m!=0)
  8. {
  9. m=m/10;
  10. k++;
  11. }
  12. return k;
  13. }
  14. int main()
  15. {
  16. int i,j,m=0;
  17. int w=0,z=0,y=0,f[10000],l[10000];
  18. scanf("%d %d",&i,&j);
  19. m=i*j;
  20. w=quwei(i);
  21. z=quwei(j);
  22. y=quwei(m);
  23. int x=y+1-w;
  24. int s=y+1-z;
  25. int c=y+1;
  26. int d=c;
  27. int t=1;
  28. for(;x>0;x--)
  29. {
  30. printf(" ");
  31. }
  32. printf("%d\n",i);
  33. printf("x");
  34. for(;s>1;s--)
  35. {
  36. printf(" ");
  37. }
  38. printf("%d\n",j);
  39. for(;c>0;c--)
  40. {
  41. printf("-");
  42. }
  43. printf("\n");
  44. for(;t<=z;t++)
  45. {
  46. f[t]=j%10;
  47. j=j/10;
  48. }
  49. int k=1;
  50. for(int v=1;k<z;k++)
  51. {
  52. v=1;
  53. t=k;
  54. if(f[t]*i==0)
  55. {
  56. for(;v<=(d-k);v++)
  57. {
  58. printf(" ");
  59. }
  60. printf("0\n");
  61. }
  62. else
  63. {
  64. for(;v<=(d-k-w+1);v++)
  65. {
  66. printf(" ");
  67. }
  68. printf("%d\n",f[k]*i);
  69. }
  70. }
  71. printf("+%d\n",f[z]*i);
  72. for(;d>0;d--)
  73. {
  74. printf("-");
  75. }
  76. printf("\n");
  77. printf(" %d",m);
  78. return 0;
  79. }

28、最大数字

用数组来写吧,废话不多说,看代码!!!

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int tiaojian(int n)
  4. {
  5. int j[1000];
  6. int m=n;
  7. int k=0,l=0;
  8. while(m!=0)
  9. {
  10. m=m/10;
  11. k++;
  12. }
  13. for(;k>0;k--,l++)
  14. {
  15. j[l]=n%10;
  16. n=n/10;
  17. }
  18. for(int t=0;t<l-1;t++)
  19. {
  20. if(j[t]<j[t+1])
  21. return 0;
  22. }
  23. return 1;
  24. }
  25. int main()
  26. {
  27. int n,x=0;
  28. scanf("%d",&n);
  29. for(;n>=1;n--)
  30. {
  31. x=tiaojian(n);
  32. if(x==1)
  33. {
  34. printf("%d",n);
  35. break;
  36. }
  37. }
  38. return 0;
  39. }

29、查找数列

本人认为挺简单的,不过要用数学思维,就相当于从1加到x,使得总和(1+2+...+x)小于输入的n,然后再用n减去该总和即为所求(本人考的更注重的是数学思维吧)(代码可直接AC)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i,j=0,m=1;
  6. int t=0;
  7. int w=0;
  8. scanf("%d",&i);
  9. while(j<i)
  10. {
  11. j=m+j;
  12. m++;
  13. }
  14. m=m-2;
  15. for(;m>=1;m--)
  16. {
  17. w=w+m;
  18. }
  19. int l=i-w;
  20. printf("%d",l);
  21. return 0;
  22. }

33、冰雹序列

明明考的是循环,但不理解为什么要放在函数的题组里面!!!

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i;
  6. scanf("%d",&i);
  7. printf("%d ",i);
  8. while(i!=1)
  9. {
  10. if(i%2==0)
  11. {
  12. i=i/2;
  13. printf("%d ",i);
  14. }
  15. else
  16. {
  17. i=i*3+1;
  18. printf("%d ",i);
  19. }
  20. }
  21. return 0;
  22. }

34、可变参数平均

本题引入了一个新的函数<stdarg.h>,感觉自己悟性不够,最开始单纯看NOJ上的题目介绍很难理解,因此就查找了很多文章,也找到了一篇很好的而且通俗易懂的文章可以帮助理解,文章作者是zldeng_scir,文章名称为:va_list使用方法,建议多读文字内容并同时复制源代码后编译有助于理解<stdarg.h>函数!!!

  1. #include<stdio.h>
  2. #include<stdarg.h>
  3. double average(double n, ...)
  4. {
  5. int i = 0;
  6. double sum = 0;
  7. va_list arg;
  8. va_start(arg, n);
  9. for(i=0; i<n; i++)
  10. {
  11. sum =sum+va_arg(arg, double);
  12. }
  13. return sum/n;
  14. va_end(arg);
  15. }
  16. int main()
  17. {
  18. double a,b,c,d,e;
  19. scanf("%lf %lf %lf %lf %lf",&a,&b,&c,&d,&e);
  20. double avg1 = average(2, a, b);
  21. double avg2 = average(3, c, d, e);
  22. printf("%.4lf",avg1-avg2);
  23. return 0;
  24. }

35、可变参数累加

本题类似于可变参数平均,如果想知道的更具体的话,可参考可变参数平均的内容

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. int sum(int n,...)
  4. {
  5. va_list sum;
  6. va_start(sum,n);
  7. int r=0;
  8. for(int i=1;i<n;i++)
  9. {
  10. r=r+va_arg(sum,int);
  11. }
  12. va_end(sum);
  13. return r;
  14. }
  15. int main()
  16. {
  17. int a,b,c,d,e,f;
  18. scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
  19. int sum1=sum(3,a,b,0);
  20. int sum2=sum(5,c,d,e,f,0);
  21. printf("%d",sum1-sum2);
  22. return 0;
  23. }

36、基思数

本来以为很简单的,但是有些情况不全面,所以就写了一个半小时,还好直接AC了,本题主要思路还是用数组来写(其实如果想找到更大的基思数的话也可以把数组大小调到更大,但如果单纯想通过NOJ的话其实1000就已经足够了)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int panduan(int n)
  4. {
  5. int i=0;
  6. int k=n;
  7. int f=n;
  8. int j[1000];
  9. while(k!=0)
  10. {
  11. k=k/10;
  12. i++;
  13. }
  14. int w=i-1;
  15. for(;w>=0;w--)
  16. {
  17. j[w]=f%10;
  18. f=f/10;
  19. }
  20. int v=i;
  21. int y;
  22. for(;v<999;v++)
  23. {
  24. for(j[v]=0,y=1;y<=i;y++)
  25. {
  26. j[v]=j[v]+j[v-y];
  27. }
  28. }
  29. int s=0;
  30. for(;s<1000;s++)
  31. {
  32. if(j[s]==n)
  33. return 1;
  34. }
  35. return 0;
  36. }
  37. int main()
  38. {
  39. int n,y;
  40. scanf("%d",&n);
  41. y=panduan(n);
  42. if(y==1) printf("Yes");
  43. else printf("No");
  44. }

38、佩尔数

方法一:直接用数组写(非常方便而且不用考虑题目中的要求便可以直接AC)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int oushu(int n,int j[])
  4. {
  5.     int z=0;
  6.     for(;z<=(n-2);z++)
  7.     {
  8.         j[z+2]=j[z]+2*j[z+1];
  9.     }
  10.     return j[n];
  11. }
  12. int main()
  13. {
  14.     int k,r=0;
  15.     int j[100000];
  16.     scanf("%d",&k);
  17.     j[0]=0;
  18.     j[1]=1;
  19.     r=oushu(k,j);
  20.     printf("%d",r);
  21.     return 0;
  22. }

方法二:根据题中所要求的调用函数去写,从中可以学到递归和递推的思路(但其实第一种方法里的数组也是一种递推思想,只不过数组的话相比于调用函数来说更为简便一些)(该方法尝试过后也可以直接AC)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int jishu(int k)
  4. {
  5.     if(k==0) return 0;
  6.     else if(k==1) return 1;
  7.     return 2*jishu(k-1)+jishu(k-2);
  8. }
  9. int oushu(int k)
  10. {
  11.     int p0=0,p1=1,pk,i=0;
  12.     int r=0;
  13.     for(;i<=k;i++)
  14.        {
  15.            if(i==0) pk=p0;
  16.         else if(i==1) pk=p1;
  17.         else
  18.         {
  19.             pk=2*p1+p0;
  20.             p0=p1;
  21.             p1=pk;
  22.         }
  23.        }
  24.         return pk;
  25. }
  26. int main()
  27. {
  28.     int k,r=0;
  29.     scanf("%d",&k);
  30.     if(k%2==0) printf("%d",oushu(k));
  31.     else    printf("%d",jishu(k));
  32.     return 0;
  33. }

39、哈沙德数

开始没理解题意,以为要一直除到最后等于1了才算哈沙德数,导致第一变提交的程序直接WA了,但是后来查询资料了才知道只要是能够一个数字n能满足除以各个位数上的数字之和后能够得到整数,那么n便是哈沙德数,然后改了下程序就AC了(但始终不理解NOJ上给了个inline int函数定义是啥意思,还差了半天发现压根用不上inline int这种内联函数。不过看了很多关于inline int的文章现在还是有点搞不明白,如果哪位大佬懂得话希望能够私信我,给我讲解讲解)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int HarshadNumber(int n)
  4. {
  5. int t=n,s=0;
  6. while(t!=0)
  7. {
  8. s=s+t%10;
  9. t=t/10;
  10. }
  11. if(s&&n%s==0) return n/s;
  12. return 0;
  13. }
  14. int main()
  15. {
  16. int n;
  17. int r=0;
  18. int k=0;
  19. scanf("%d",&n);
  20. while(n!=1)
  21. {
  22. r=HarshadNumber(n);
  23. n=r;
  24. if(r==0) break;
  25. k++;
  26. }
  27. printf("%d",k);
  28. return 0;
  29. }

40、素数

显然,题目给了三种求素数的方法,肯定是不想让我们用遍历的方法去求素数,如果一个一个遍历去判断的话会TE超时,因此要结合第二种和第三种方法。具体思路来源于文章(方法四):判断一个数是否为质数(素数)的4种方法

  1. #include <stdio.h>
  2. #include <math.h>
  3. int sushu(int t)
  4. {
  5. int l=2;
  6. for(;l<=sqrt(t);l++)
  7. {
  8. if(t%l==0) return 0;
  9. }
  10. return 1;
  11. }
  12. int main()
  13. {
  14. int i,j;
  15. int k=1;
  16. int f=0;
  17. scanf("%d %d",&i,&j);
  18. int t=i;
  19. if(t==1) t++;//如果出现t=1的情况会使得调用的功能函数直接跳到return 1导致结果多一种情况,因此直接跳过1的这种情况,因为1本来就不是素数
  20. if(t>=1&&t<=5)
  21. {
  22. while(t<=j)
  23. {
  24. if(k==sushu(t)) f++;
  25. t++;
  26. }
  27. }
  28. else
  29. {
  30. for(;t<=j;t++)
  31. {
  32. if(t%6==1||t%6==5)
  33. if(k==sushu(t)) f++;
  34. }
  35. }
  36. printf("%d",f);
  37. return 0;
  38. }

43、波士顿房价预测

首先得学会最小二乘法的计算,可自行在网上搜索相关计算。其次就是要通过循环将多个数字存放在数组中从而便于后面的计算。其他的倒没啥新鲜的东西了。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n;
  6. int i,m;
  7. int k=1;
  8. double l=0;
  9. double u=0;
  10. int j[1000][2];
  11. scanf("%d",&n);
  12. for(;n!=0;n--)
  13. {
  14. scanf("%d %d",&i,&m);
  15. j[k][0]=i;
  16. j[k][1]=m;
  17. k++;
  18. }
  19. k--;
  20. int x=1;
  21. double z=0;
  22. for(;x<=k;x++)//求x的平均值
  23. {
  24. z=z+j[x][0];
  25. }
  26. l=z/k;
  27. int s=1;
  28. double y=0;
  29. for(;s<=k;s++)//求y的平均值
  30. {
  31. y=y+j[s][1];
  32. }
  33. u=y/k;
  34. int p=1;
  35. double q=0;
  36. for(;p<=k;p++)
  37. {
  38. q=q+j[p][0]*j[p][1];
  39. }
  40. double c=q-k*l*u;
  41. p=1;
  42. double d=0;
  43. for(;p<=k;p++)
  44. {
  45. d=d+j[p][0]*j[p][0];
  46. }
  47. double f=d-k*l*l;
  48. double b=c/f;
  49. double a=u-l*b;
  50. printf("Y=%.4lf+%.4lf*X",a,b);
  51. return 0;
  52. }

44、航空旅行

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int i;
  6. int j[36000][5];
  7. int a,b,c,d,e;
  8. scanf("%d",&i);
  9. int k=1;
  10. for(;k<=i;k++)
  11. {
  12. scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
  13. j[k][0]=a;
  14. j[k][1]=b;
  15. j[k][2]=c;
  16. j[k][3]=d;
  17. j[k][4]=e;
  18. }
  19. k=1;
  20. for(;k<=i;k++)
  21. {
  22. if((j[k][0]+j[k][1]<=j[k][3]&&j[k][2]<=j[k][4])||(j[k][0]+j[k][2]<=j[k][3]&&j[k][1]<=j[k][4])||(j[k][1]+j[k][2]<=j[k][3]&&j[k][0]<=j[k][4]))
  23. printf("YES\n");
  24. else printf("NO\n");
  25. }
  26. return 0;
  27. }

48、回文数和

感觉不是很难,就是要调用三个函数,该程序可以AC,废话不多说,上代码!

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int quwei(int a);
  4. int huiwenshu(int b);
  5. int jinzhihuiwen(int c,int d);
  6. int main()
  7. {
  8. int i,j;
  9. int k=1;
  10. int m=0;
  11. int s=1;
  12. scanf("%d %d",&i,&j);
  13. for(;k<=i;k++)
  14. {
  15. if(k<j)
  16. {
  17. m=m+k;
  18. }
  19. else
  20. {
  21. if(huiwenshu(k)==s&&jinzhihuiwen(k,j)==s)
  22. m=m+k;
  23. }
  24. }
  25. printf("%d",m);
  26. return 0;
  27. }
  28. int quwei(int a)
  29. {
  30. int t=0;
  31. while(a!=0)
  32. {
  33. a=a/10;
  34. t++;
  35. }
  36. return t;
  37. }
  38. int huiwenshu(int b)
  39. {
  40. int x=0;
  41. x=quwei(b);
  42. int j[1000];
  43. int k=1;
  44. for(;k<=x;k++)
  45. {
  46. j[k]=b%10;
  47. b=b/10;
  48. }
  49. for(int m=1;m<=(x/2);m++)
  50. {
  51. if(j[m]!=j[m+x-1])
  52. return 0;
  53. }
  54. return 1;
  55. }
  56. int jinzhihuiwen(int c,int d)
  57. {
  58. int j[10000];
  59. int n=1;
  60. for(;c!=0;n++)
  61. {
  62. j[n]=c%d;
  63. c=c/d;
  64. }
  65. for(int m=1;m<=(n/2);m++)
  66. {
  67. if(j[m]!=j[n-m])
  68. return 0;
  69. }
  70. return 1;
  71. }


 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/545370
推荐阅读
相关标签
  

闽ICP备14008679号