计概杂烩2014

发布时间 2023-12-15 15:30:50作者: oierwyh

2015

两点间距离

#include <stdio.h>
#include<math.h>

double x1,y11,z1,x2,y2,z2;

int main(void) { 
	scanf("%lf,%lf,%lf\n%lf,%lf,%lf",&x1,&y11,&z1,&x2,&y2,&z2);
	double squ=(x1-x2)*(x1-x2)+(y11-y2)*(y11-y2)+(z1-z2)*(z1-z2);
	double ans=sqrt((x1-x2)*(x1-x2)+(y11-y2)*(y11-y2)+(z1-z2)*(z1-z2));
	printf("%.2lf\n",ans);
	return 0;
}

选美比赛

#include <stdio.h>

/* C语言初始模板程序 */

int main(void) { 
	char c;int x,b;scanf("%c%d",&c,&x);
	if(c=='M') b=x>100?1:0;
	else b=x>80?1:0;
	if(b) printf("Beauty\n");
	else printf("Not beauty\n");
	return 0;
}

正整数的约数数目

#include <stdio.h>

/* C语言初始模板程序 */

int main(void) { 
	int n,ans=0;scanf("%d",&n);
	for(int i=1;i<=n;++i)  
	    if(n%i==0) ++ans;
	printf("%d\n",ans);
	return 0;
}

级数求和

#include <stdio.h>

int main(void) { 
	double cnt=0;
	int n,i=1;scanf("%d",&n);
	while(cnt<=n)
	{
	    cnt+=1.0/i++;
//	    printf("%.2lf\n",cnt);
	}
	printf("%d\n",i-1);
	return 0;
}

这里注意精度,用1.0而不是1

正整数的最大公约数和最小公倍数

#include <stdio.h>

int n,a[100],gcd=1,lcm=1,maxx=1;

int main(void) { 
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
	    scanf("%d",&a[i]);
	    maxx*=a[i];
	}
	for(int i=1;i<=a[1];++i)
	{
	    int b=0;
	    for(int j=1;j<=n;++j)
	        if(a[j]%i)
	        {
	            b=1;break;
	        }
	    if(b==0) gcd=i;
	}
	for(int i=a[n];i<=maxx;++i)
	{
	    int b=0;
	    for(int j=1;j<=n;++j)
	    {
	        if(i%a[j])
	        {
	            b=1;break;
	        }
	    }
	    if(b==0)
	    {
	        lcm=i;
	        break;
	    }
	}
	printf("%d %d\n",gcd,lcm);
	return 0;
}

直接枚举并判断即可

颜值测试

#include <stdio.h>

int a[200][200],b[200][200];

int main(void) { 
	int n,m;scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)
	        scanf("%d",&a[i][j]);
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)
	        scanf("%d",&b[i][j]);
	for(int i=1;i<=n;++i,printf("\n"))
	    for(int j=1;j<=m;++j)
	        if(j==m)
	            printf("%d",a[i][j]-b[i][j]);
    	    else
	            printf("%d ",a[i][j]-b[i][j]);
	return 0;
}

IBM编码

#include <stdio.h>
#include<string.h>

char a[100];

int main(void) { 
	int n;scanf("%d\n",&n);
	while(n--)
	{
	    gets(a);int l=strlen(a);
	    for(int i=0;i<l;++i)
	    {
	        if((a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z'))
	        {
	            a[i]++;
	            if(a[i]=='Z'+1||a[i]=='z'+1)
	                a[i]-=26;
	        }
	    }
	    puts(a);
	}
	return 0;
}

表示大整数

#include <stdio.h>
#include <string.h>

int n,k;
char a[100][100];

int main(void) { 
	scanf("%d\n",&n);
	while(n--)
	{
	    scanf("%s",a[n]);int l=strlen(a[n]);
	    scanf(" %d\n",&k);
	    if(a[0]=='-') printf("-");
	    for(int i=0;i<l;++i)
	    {
	        if(a[i]=='-') continue;
	        if((l-i-1)%k==0&&a[n][i]!='-'&&i!=l-1)
	            printf("%c,",a[n][i]);
	        else printf("%c",a[n][i]);
	    }
	    printf("\n");
	}
	return 0;
}

注意负数要往前移一个

医院排号

#include <stdio.h>

int t,n,k;
int a[2000],b[2000];

int main(void) { 
	scanf("%d",&t);
	while(t--)
	{
	    scanf("%d%d",&n,&k);
	    for(int i=1;i<=n;++i) {scanf("%d",&a[i]);b[i]=i;}
	    for(int i=1;i<n;++i)
	        for(int j=i+1;j<=n;++j)
	            if(a[i]<a[j]||(a[i]==a[j]&&b[i]>b[j]))
	            {
	                int tmp=a[i];a[i]=a[j];a[j]=tmp;
	                tmp=b[i];b[i]=b[j];b[j]=tmp;
	            }
	    k=k<n?k:n;printf("%d\n",k);
	    for(int i=1;i<=k;++i)
	        if(i==k)
	            printf("%d",b[i]);
	        else printf("%d ",b[i]);
	   printf("\n");
	}
	return 0;
}

铺地板

#include <stdio.h>
#include <string.h>

int a[200][200];
int n;

int f(int x)
{
	return x<1||x>n;
}

int main(void) { 
	scanf("%d",&n);
	int x1=-1,y1=1,x=1,y=1;
	for(int i=1;i<=n*n;++i)
	{
		a[x][y]=i;
		if(f(x+x1)&&f(y+y1))
		{
			if(x+x1==0) {x++;x1=-x1;y1=-y1;}
			if(y+y1==0) {y++;x1=-x1;y1=-y1;}
		}
		else if(f(x+x1)) {y++;x1=-x1;y1=-y1;}
		else if(f(y+y1)) {x++;x1=-x1;y1=-y1;}
		else {x+=x1;y+=y1;}
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(j!=n) printf("%d ",a[i][j]);
			else printf("%d\n",a[i][j]);
	return 0;
}

找规律填数即可,这里f函数是算某个坐标是否出界的。
注意前半个三角形和后面半个中间规律可能发生了变化,判断一下即可。

整数删除若干数字后的最小数

#include <stdio.h>
#include <string.h>
char a[200],q[200];
int k,m,cnt;

int main(void) { 
	scanf("%s",a);scanf("%d",&k);
	int l=strlen(a),l1=0,l2=l-k;
	q[0]=a[0];
	for(int i=1;i<l;++i)
	{
//	    if(k==0) break;
	    if(cnt==-1) q[++cnt]=a[i];
	    else if(q[cnt]>a[i]&&k!=0)
	    {
	        --k;--cnt;--i;
	    }
	    else
	    {
	        q[++cnt]=a[i];
	    }
	}
	while(q[l1]=='0') ++l1;
	for(int i=l1;i<l2;++i) printf("%c",q[i]);
	if(l1>=l2) printf("0\n");
	return 0;
}

思路:删除两边的k个数就相当于留下中间的n-k个数,使中间连续n-k个数最小,可以用前缀和处理。

前缀和:设\(b[1]=a[1],b[i]=b[i-1]+a[i](i>=2)\)

(即\(b[i]=a[1]+a[2]+...+a[i]\))

那么a数组中间第i个到第i+m个的和就是\(b[i+m]-b[i-1]\)

这样就避免了一次一次计算的超时。

(连载中。。。。。。