当前位置: 代码迷 >> 综合 >> 杭电oj2050-2058————C语言
  详细解决方案

杭电oj2050-2058————C语言

热度:32   发布时间:2023-10-24 10:51:16.0

2050.折线分割平面

http://acm.hdu.edu.cn/showproblem.php?pid=2050
直线:第n条与之前的有 n-1 个交点,(n-1)+1 个平面;
折线:第n条最多与之前的有2?2(n?1)交点(一折两直), 2?2(n?1)+1个平面,
递推f(n)=f(n?1)+4n?3

第一种:

#include <stdio.h>
int cal(int n)
{
    return n==1?2:(cal(n-1)+4*(n-1)+1);
}int main()
{
    int c,n;scanf("%d",&c);while(c--){
    scanf("%d",&n);printf("%d\n",cal(n));}return 0;
}

第二种:

#include <stdio.h>
int main()
{
    int c,n;__int64 f[10001]={
    0,2,7};for(int i=3;i<=10000;i++){
    f[i]=f[i-1]+4*i-3;}scanf("%d",&c);while(c--){
    scanf("%d",&n);printf("%I64d\n",f[n]);}return 0;
}

2051.Bitset
和2031.进制转换差不多
http://acm.hdu.edu.cn/showproblem.php?pid=2051

#include<stdio.h>
int main()
{
    int n,i, arr[500], t = 0;while (~scanf("%d", &n) ){
    for ( i = 0; n!=0; i++){
    arr[i] = n % 2;n = n / 2;    }//i++是先执行再自增,多1for (int j = i-1; j >= 0; j--)printf("%d", arr[j]);printf("\n");}return 0;
}

2052.Picture
和2032.杨辉三角差不多,但是不要用数组做,数组会覆盖


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

2053Switch Game
http://acm.hdu.edu.cn/showproblem.php?pid=2055

  1. 1 1 1 1 1 1 1 1 1 1 1 1 1
  2. 1 0 1 0 1 0 1 0 1 0 1 0 1
  3. 1 0 0 0 1 1 1 0 0 0 1 1 1
  4. 1 0 0 1 1 1 1 1 0 0 1 0 1
  5. 1 0 0 1 0 1 1 1 0 1 1 0 1
  6. 1 0 0 1 0 0 1 1 0 1 1 1 1
  7. 1 0 0 1 0 0 0 1 0 1 1 1 1
  8. 1 0 0 1 0 0 0 0 0 1 1 1 1
  9. 1 0 0 1 0 0 0 0 1 1 1 1 1
  10. 1 0 0 1 0 0 0 0 1 0 1 1 1

就是除了 n*n 是 1 ,其余的都是 0

#include<stdio.h>
#include<math.h>
int main()
{
    int n,k;while(~scanf("%d",&n)){
    k=sqrt(n);if(k*k==n) printf("1\n");else printf("0\n");}return 0;
}

2054

2055.An easy problem

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2055

本题要是有人设52个变量的话就有点沙雕
我是利用ascii码来算的
大写A是65 Z是90
A若要为1,只能65-64

小写a是97 z是122
a先乘-1再加96就能变为-1

#include <stdio.h>
int main()
{
    char i;int a,n;scanf("%d",&n);while(n--){
    scanf("%s %d",&i,&a);//输入int j=i;//转换为整数型int k=0;if(i>='A'&&i<='Z')//输入为大写时k=j-64;else //输入为小写时k=(-1)*j+96;printf("%d\n",k+a);}
return 0;
}

2056.Rectangles
http://acm.hdu.edu.cn/showproblem.php?pid=2056
翻译了c语言版本
http://blog.sina.com.cn/s/blog_ac5ed4f30101dr2z.html

#include <stdio.h>
int main()
{
    double x1,y1,x2,y2,x3,y3,x4,y4,a,b,c,d,t;while(~scanf("%lf%lf%lf%lf %lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)){
    if(x1>x2) {
    t=x1;x1=x2;x2=t;}if(x3>x4) {
    t=x3;x3=x4;x4=t;}if(y1>y2) {
    t=y1;y1=y2;y2=t;}if(y3>y4){
    t=y3;y3=y4;y4=t;}if(y2<y3||x2<x3||y1>y4||x1>x4)//最大的比你最小的还小,没的玩printf("0.00\n");else{
    if(x1<=x3)//双方最小的比较a=x3;elsea=x1;if(x2<=x4)//最大的比较b=x2;elseb=x4;if(y1<=y3)//最小的比较c=y3;elsec=y1;if(y2<=y4)//最大的比较d=y2;elsed=y4;printf("%.2lf\n",(b-a)*(d-c));//长×宽,有些解法是用fabs绝对值}}return 0;
}

2057.A + B Again
http://acm.hdu.edu.cn/showproblem.php?pid=2057
首先考虑范围大,其次对于负数需要注意
大写的X对应大写字母,小写x对应小写字母
16进制是%x ,大数就%I64x
8进制是%o
10进制是%d
不管是8进制还是16进制都是一样的方法

#include<stdio.h>
int main()
{
    __int64 a,b,c;while(scanf("%I64X %I64X",&a,&b)!=EOF){
    c=a+b;if(c>=0) {
    printf("%I64X\n",c);}else {
    printf("-%I64X\n",-c);}//正常是无法输出负数的}	return 0;
}	

2058.The sum problem
http://acm.hdu.edu.cn/showproblem.php?pid=2058
首项为a,如果个数为t,则尾项为a+t-1
等差数列公式:
(a+(a+t-1))*t/2=m
化简求得a=m/t+(t-1)/2,
先求t

#include <stdio.h>
int main()
{
    double n,m,a,t,i;while(~scanf("%lf%lf",&n,&m)){
    if(n==0&&m==0) break;for(i=0;i<m;i++){
    a=m/i-(i-1)/2;if(a<1) break;}//目的是为了限制a和t的范围,首项a有可能是负的for(t=i-1;t>=0;t--)//t是为了求长度,t=i-1是因为i++的性质{
    a=m/t-(t-1)/2;if(a-(int)a==0.0) //还是为了限制aprintf("[%d,%d]\n",(int)a,(int)a+(int)t-1);}printf("\n");}return 0;
}