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=21∣∣∣∣∣∣x1x2x3y1y2y3111∣∣∣∣∣∣
故对于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;
}