HDOJ 2031-2040

2031 进制转换

最恶心我的是int类型转char类型。
int类型的1加上48等于char类型的1。
原来是int类型的1的十六进制是0x01、十进制是1、八进制是0001,加上48分别变成变成0x31、49、0061。正好就是1的ASCII码。如果结果是字符类型,正好就是字符1。

#include<bits/stdc++.h>
int main(){
    
    
	int n,r;
	char num[34];
	while(~scanf("%d %d",&n,&r)){
    
    
		if(n==0){
    
    
			printf("0\n");
			continue;
		}
		int sign=1; 
		if(n<0){
    
    
			n = -n;
			sign = -1;
		}
		int len=0;
		while(n!=0){
    
    
			num[len] = n%r<=9?(n%r+48):(n%r+55);
			len++;
			n = n/r;
		}		
		if(sign<0) printf("-",sign); //带符号 
		while(len) printf("%c",num[--len]);
		printf("\n");
	}
	return 0;
} 

2032 杨辉三角

用二维数组存储。

#include<bits/stdc++.h>
int main(){
    
    
	int n;
	while(~scanf("%d",&n)){
    
    
		int num[31][31] = {
    
     0 };
		num[1][1]=1;
		num[2][1]=1;
		num[2][2]=1;
		for(int i=1;i<=n;i++){
    
    
			if(i==1){
    
    
				printf("1\n");
				continue;
			}else if(i==2){
    
    
				printf("1 1\n");
				continue;
			}
			for(int j=1;j<=i;j++){
    
    
				if(j==1){
    
    
					num[i][j] = 1;
					printf("1 ");
				}else if(j==i){
    
    
					num[i][j] = 1;
					printf("1\n");
				}else{
    
    
					num[i][j] = num[i-1][j] + num[i-1][j-1];
					printf("%d ",num[i][j]);
				}
			}
		}
		printf("\n");
	}
	return 0;
}

2033 人见人爱A+B

#include<bits/stdc++.h>
int main(){
    
    
	int n;
	scanf("%d",&n);
	while(n--){
    
    
		int time[3]={
    
    0},var;
		for(int i=0;i<6;i++){
    
    
			scanf("%d",&var);
			time[i%3] += var;
		} 
		for(int i=2;i>0;i--){
    
    
			if(time[i]>=60){
    
    
				time[i] = time[i]%60;
				time[i-1] += 1;
			}
		}
		printf("%d %d %d\n",time[0],time[1],time[2]);
	}
	return 0;
}

2034 人见人爱A-B

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int n,m;
	while(~scanf("%d %d",&n,&m)){
    
    
		if(n==0 && m==0) break;
		int setn[n+2],setm[m+2],result[n+2]={
    
    0};
		for(int i=0;i<n;i++){
    
    
			scanf("%d",&setn[i]);
		}
		for(int i=0;i<m;i++){
    
    
			scanf("%d",&setm[i]);	
		}
		sort(setn,setn+n);
		sort(setm,setm+m);
		int nf=0,mf=0;
		while(nf<n && mf<m){
    
      //关键
			if(setn[nf]>setm[mf]) mf++;
			else if(setn[nf]<setm[mf]) nf++;
			else result[nf++] = 1;
		}
		
		int sign=0;
		for(int i=0;i<n;i++) if(result[i]==0){
    
    
			printf("%d ",setn[i]);
			sign=1;
		}
		if(sign==0) printf("NULL");
		printf("\n");
	}
	return 0;
}

2035 人见人爱A^B

关键在于找到规律。结果的最后三位,只与乘数和被乘数的后三位有关系。

#include<bits/stdc++.h>
int main(){
    
    
	int n,m;
	while(~scanf("%d %d",&n,&m)){
    
    
		if(n==0 && m==0) break;
		int r1,r2,r3;
		int result = n%1000;
		int bai = result/100,ge=result%10,shi=result/10%10; //不变的乘数
		m--;
		while(m--){
    
    
			r1 = result*ge;
			r2 = result*shi%100*10;
			r3 = result*bai%10*100;
			result = (r1+r2+r3)%1000;
		}
		printf("%d\n",result);
	}
	return 0;
}

2036 改革春风吹满地

我的想法是划分为三角形的方法求解。然后利用海伦公式。但是对于任意多边形,凹、凸都可能。故失败。
后来找到了真正的牛逼的计算多边形面积的方法。


计算多边形的有向面积:任意一点(一般选原点0,0)与多边形上依次两点连线构成三角形的有向面积的和。
三角形有向面积:
S = 1 2 ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ S = \frac{1}{2} \begin{vmatrix} x_1 & y_1 &1 \\ x_2 & y_2 &1 \\ x_3 & y_3 &1 \end{vmatrix} S=21x1x2x3y1y2y3111

故对于n边形来说,共计算n次三角形有向面积。

#include<bits/stdc++.h>
int main(){
    
    
	int n;
	while(~scanf("%d",&n) && n!=0){
    
    
		int point[n+1][2];
		for(int i=0;i<n;i++){
    
    
			scanf("%d",&point[i][0]);
			scanf("%d",&point[i][1]);
		}
		point[n][0] = point[0][0];
		point[n][1] = point[0][1];
		
		double s=0;
		for(int i=0;i<n;i++) //关键
			s += point[i][0]*point[i+1][1]-point[i][1]*point[i+1][0];
		printf("%.1f\n",s/2); 
	}
	return 0;	
}

2037 今年暑假不AC

2038

2039 三角形

注意审题:三个正数,不是正整数。

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int n;
	scanf("%d",&n);
	while(n--){
    
    
		double num[3];
		scanf("%lf %lf %lf",&num[0],&num[1],&num[2]);
		sort(num,num+3);
		if(num[0]+num[1]>num[2]) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

2040 亲和数

#include<bits/stdc++.h>
int lov(int a){
    
    
	int sum=0;
	for(int i=1;i<a;i++){
    
    
		if(a%i==0) sum += i;
	}
	return sum;	
}
int main(){
    
    
	int m;
	scanf("%d",&m);
	while(m--){
    
    
		int a,b;
		scanf("%d %d",&a,&b);
		if(lov(a)==b && lov(b)==a) printf("YES\n");
		else printf("NO\n");
	}
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/qq_46523755/article/details/114836486