XYNU—ACM暑假集训第二次测试

欢迎访问XYNUOJ

1767     1768    1769   1770   1771   1772   1773   1774

问题 A: Sky 数

时间限制: 1 Sec   内存限制: 33 MB
提交: 62   解决: 18
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。


输入

输入含有一些四位正整数,如果为0,则输入结束。

输出

若n为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”。每个结果占一行。注意:#n表示所读入的n值。

样例输入

2992
1234
0

样例输出

2992 is a Sky Number.
1234 is not a Sky Number.

提示

此题是求一个四位数,判断表示十进制各位数字之和,表示十二进制各位数字之和,表示十六进制各位数字之和是否相等。
#include<stdio.h>
int main()
{
	int N;
	while(scanf("%d",&N)!=EOF&&N!=0)   //输入
	{
		int sum1=0, sum2 = 0, sum3 = 0;   //初始化
		for(int i = N; i > 0;)    //10进制各位数字之和
		{
			sum1 = sum1 + i%10;
			i  = i / 10;
		}
		for(int i = N; i > 0;)    //16进制各位数字之和
		{
			sum2 = sum2 + i%16;
			i  = i / 16;
		}
		for(int i = N; i > 0;)    //12进制各位数字之和
		{
			sum3 = sum3 + i%12;
			i  = i / 12;
		}
		if(sum1==sum2&&sum2==sum3)   //判断是否相等,并对应相应输出
		{
			printf("%d is a Sky Number.\n",N);
		}else{
			printf("%d is not a Sky Number.\n",N);
		}
		
	}
	return 0;
}

#include<stdio.h>
int main(){
	int panduan(int n,int r);
	int n;
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		if(panduan(n,10)==panduan(n,12)&&panduan(n,12)==panduan(n,16))//调用函数
			printf("%d is a Sky Number.\n",n);
		else 
		printf("%d is not a Sky Number.\n",n);
	}
	return 0;
}
int panduan(int n,int r)   //求一个数对应进制—各位数字之和
{
	int sum=0,s;
	do{
		s=n%r;
		n=n/r;
		sum=sum+s;
	}while(n!=0);
	return (sum);
}
上面两种方法时间复杂度并未减小!!!!二更具一种通用性。

#include<stdio.h>
#include<math.h>
int main()
{
	int a;
	while(~scanf("%d",&a)&&a!=0)
	{
		int a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3;  //题目已说是一个四位数
		a1=a%10;a2=a%100/10;a3=a%1000/100;a4=a/1000;
		b1=a%12;b2=a/12%12;b3=a/12/12%12;b4=a/12/12/12%12;
		c1=a%16;c2=a/16%16;c3=a/16/16%16;
		if((a1+a2+a3+a4)==(b1+b2+b3+b4)&&(a1+a2+a3+a4)==(c1+c2+c3))
		{
		printf("%d is a Sky Number.\n",a);}	
		else
		{
		printf("%d is not a Sky Number.\n",a);	
		}
	}
	return 0;
}

问题 B: Encoding

时间限制: 1 Sec   内存限制: 33 MB
提交: 37   解决: 3
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

Given a string containing only 'A' - 'Z', we could encode it using the following method:

1. Each sub-string containing k same characters should be encoded to "kX" where "X" is the only character in this sub-string.

2. If the length of the sub-string is 1, '1' should be ignored.

输入

The first line contains an integer N (1 <= N <= 100) which indicates the number of test cases. The next N lines contain N strings. Each string consists of only 'A' - 'Z' and the length is less than 10000.

输出

For each test case, output the encoded string in a line.

样例输入

2
ABC
ABBCCC

样例输出

ABC
A2B3C

提示

#include <stdio.h>  
#include <string.h>  
int main(){  
    int N;  
    char a[10005];  
    scanf("%d",&N);  
    while(N--){    //输入多组测试数据
        scanf("%s",a);  
        int count=1;  
        for(int i=0;i<strlen(a);i++){    //子串   分为一个字母   多个字母分别按格式输出
            if(a[i]==a[i+1])count++;  
            else{  
                if(count==1) printf("%c",a[i]);  
                else printf("%d%c",count,a[i]);  
                count=1;  
            }  
        }  
        printf("\n");  
    }  
}  

问题 C: 分拆素数和

时间限制: 1 Sec   内存限制: 33 MB
提交: 36   解决: 23
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

把一个偶数拆成两个不同素数的和,有几种拆法呢?

输入

输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。

输出

对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。

样例输入

30
26
0

样例输出

3
2

提示

#include<stdio.h>
#include<math.h>
int fun(int n)   //判断是否为素数
{
    int i,t=1;
    
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            t=0;
            break;
        }
    }
    return t;
}
int main()
{
    int n,i=3,j,k,t=0,sum=0;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        for(i=3;i<n/2;i=i+2)
        {
            if(fun(i)==1 && fun(n-i)==1)sum++;   //拆分两个数,判断是否为素数
        }
        
        printf("%d\n",sum);
        sum=0;
    }
    
    return 0;
}

问题 D: 20岁生日

时间限制: 1 Sec   内存限制: 128 MB
提交: 45   解决: 9
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

路过这的20岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达20岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达20岁生日所经过的总天数,让他好来比较一下。

输入

一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。

输出

T行,每行一个数,表示此人从出生到20岁生日所经过的天数。如果这个人没有20岁生日,就输出-1。

样例输入

1
1988-03-07

样例输出

7305
#include<stdio.h>
int main()
{
	
	int T,i,j;
	scanf("%d",&T);
	while(T--)
	{
		int year,month,day;
		scanf("%d-%d-%d",&year,&month,&day);
		int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		int sum1,sum2,sum3,flag,flag1;
		sum1 = sum2 = sum3 = 0;
		for(i=year+1; i<year+20;i++)
		{
			if(i%4==0&&i%100!=0||i%400==0)
			{
				sum1 = sum1 + 366;
			}else{
				sum1 = sum1 + 365;
			}
		}
		
		//出生那年余下的天数
		if(year%4==0&&year%100!=0||year%400==0)
		{
			a[2] = 29; 
			flag = 1;
		}
		for(i=month+1;i<13;i++)
		{
			sum2 = sum2 + a[i]; 
		}
		sum2 = sum2 + a[month] - day;
		
		//20周岁那年多出的天数 
		if((year+20)%4==0&&(year+20)%100!=0||(year+20)%400==0)
		{
			a[2] = 29; 
			flag1 = 1;
		}else{
			a[2] = 28;
			flag1 = 0;
		}
		
		for(i=0;i<month;i++)
		{
			sum3 = sum3 + a[i];
		} 
		sum3 = sum3 + day;
		
		if(flag==1&&flag1==0&&month==2&&day==29)
		{
			printf("-1\n");
		}else{
			printf("%d\n",sum1+sum2+sum3);
		}
			
	} 
	return 0;
}
//闰年29天  平年28天  并注意没有20岁生日的条件 
        

#include<stdio.h>
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int y,m,d;
		scanf("%d-%d-%d",&y,&m,&d);
		int i,sum=0;
		if(m==2&&d==29)  //没有20岁生日
		{
			if(!((y+20)%400==0||((y+20)%4==0&&(y+20)%100!=0)))
			{
			    printf("-1\n");
			    continue;
			}
		}
		for(i=1;i<20;i++)  //20岁生日 19年的天数
		{
			if((y+i)%400==0||((y+i)%4==0&&(y+i)%100!=0))
			    sum+=366;
			else
			    sum+=365;
		}
		if(m<=2)  //如果出生月份<=2, 判断出生年份是否为闰年
		{
			if(y%400==0||(y%4==0&&y%100!=0))
			    sum+=366;
			else
			    sum+=365;
		}
		else if(m>=3)   //如果出生月份>=3,判断year+20是否为闰年
		{
			if((y+20)%400==0||((y+20)%4==0&&(y+20)%100!=0))
			    sum+=366;
			else
			    sum+=365;
		}
		printf("%d\n",sum);
	}
	return 0;
}

#include<stdio.h>
int main()
{
	int N;
	scanf("%d",&N);
	while(N--)
	{
		int year,month,day,i,sum,first,last,count=0;
		scanf("%d-%d-%d",&year,&month,&day);
		if(((year+20)%400!=0&&(year+20)%100==0&&(year+20)%4==0)&&month==2&&day==29)
		{
			printf("-1\n");
			continue;
		}
		for(i=1;i<=20;i++) 
		{
			if(year%400==0||(year%4==0&&year%100!=0))
				count++;
			year++;
		}
		sum=365*20+count;
		printf("%d\n",sum);
	}
	return 0;
} 

问题 E: Divisible number

时间限制: 1 Sec   内存限制: 128 MB
提交: 136   解决: 43
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

1, 2, 3... ... N this n (0 < n < = 1000000000) in the number of how many Numbers can be divided exactly by positive integer b

输入

Input contains multiple sets of data

Each group of data is a line, each row is given two positive integer n, b.

输出

Input contains multiple sets of data

Each group of data is a line, each row is given two positive integer n, b.

样例输入

2 1
5 3
10 4

样例输出

2
1
2

#include<stdio.h>
int main()
{
	int n,b;
	while(scanf("%d%d",&n,&b)!=EOF)
	{
		printf("%d\n",n/b);
	}
} 
//下面用for循环超时0 < n < = 1000000000
#include<stdio.h>
int main()
{
	int n, b;
	while(scanf("%d%d",&n,&b)!=EOF)
	{
		int count = 0;
		for(int i = 0; i < n; i++)
		{
			if(i % b == 0)
			{
				count ++;
			}
		}
		printf("%d\n",count);
	}
}


问题 F: Quicksum

时间限制: 1 Sec   内存限制: 128 MB
提交: 31   解决: 20
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

A checksum is an algorithm that scans a packet of data and returns a single number. The idea is that if the packet is changed, the checksum will also change, so checksums are often used for detecting transmission errors, validating document contents, and in many other situations where it is necessary to detect undesirable changes in data.

For this problem, you will implement a checksum algorithm called Quicksum. A Quicksum packet allows only uppercase letters and spaces. It always begins and ends with an uppercase letter. Otherwise, spaces and letters can occur in any combination, including consecutive spaces.

A Quicksum is the sum of the products of each character's position in the packet times the character's value. A space has a value of zero, while letters have a value equal to their position in the alphabet. So, A=1, B=2, etc., through Z=26. Here are example Quicksum calculations for the packets "ACM" and "MID CENTRAL":

ACM: 1*1  + 2*3 + 3*13 = 46

MID CENTRAL: 1*13 + 2*9 + 3*4 + 4*0 + 5*3 + 6*5 + 7*14 + 8*20 +
9*18 + 10*1 + 11*12 = 650

输入

The input consists of one or more packets followed by a line containing only # that signals the end of the input. Each packet is on a line by itself, does not begin or end with a space, and contains from 1 to 300 characters.

输出

For each packet, output its Quicksum on a separate line in the output.

样例输入

ACM
MID CENTRAL
REGIONAL PROGRAMMING CONTEST
ACN
A C M
ABC
BBC
#

样例输出

46
650
4690
49
75
14
15
#include<stdio.h>
#include<string.h>
int main()
{
	char s[305];	
	while(gets(s))
	{
		if(s[0] == '#')
		{
			break;
		}
		int sum = 0;
		for(int i = 0; i < strlen(s); i++)
		{
			if(s[i] == ' ')
			{
				continue;
			}
			sum = sum + (s[i]-'A'+1)*(i+1);
			//printf("%d ",sum);
		}
		printf("%d\n",sum);
	}
	
}

问题 G: Fibonacci Again!

时间限制: 1 Sec   内存限制: 128 MB
提交: 112   解决: 25
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

求第n个斐波那契数是否是一个素数,n为整数
f[n]=f[n-1]+f[n-2] (2<n<30)
f[1]=3,f[2]=7

输入

输入整数m,0<m<30,输入-1表示结束输入

输出

如果f[m]是素数 则输出Yes,否则输出No,
每行输出占一行。

样例输入

2
3

样例输出

Yes
No
//3 7 10 17 27 44 71 115 186 301 
  //487 788 1275 2063 3338  5401 8739 14140 22879 37019 59898 96917
  //156815 253762 410547 664279 1074826  1739105  2813931
/*
#include<stdio.h>
int main()
{
	int a[30];
	a[1] = 3;
	a[2] = 7;
	for(int i = 3; i < 31; i++)
	{
		a[i] = a[i-1]+a[i-2];
		printf("%d\n",a[i]);
	}
	
}
*/ 
#include<stdio.h>
int fib(int n)
{
	if(n>2)  
        return fib(n-1)+fib(n-2);  
    if(n==1)  
        return 3;  
    if(n==2)  
        return 7; 
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF&&n!=-1)
	{
		int N, i;
		if(n==0)
		{
			printf("No\n");
			continue;
		} 
		if(n==1)
		{
			printf("Yes\n");
			continue;
		} 
		N = fib(n);
		//printf("%d ",N);
		
		for(i = 2; i < N; i++)
		{
			if(N % i == 0)
			{
				break;
			}
		 } 
		 if( i >= N)
		 {
		 	printf("Yes\n");
		 }else{
		 	printf("No\n");
		 }
	}
}

问题 H: 最少拦截系统

时间限制: 1 Sec   内存限制: 33 MB
提交: 48   解决: 5
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

输入

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

输出

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

样例输入

8 389 207 155 300 299 170 158 65

样例输出

2
#include<stdio.h>  
#include<string.h>  
int main(){  
    int n,i,j,k,a[1000],b[1000];   //声明两个数组,并b[1000]为导弹能打到的高度   
    while(scanf("%d",&n)!=EOF){  
        k = 0;  
        scanf("%d",&a[0]);  
        b[k] = a[0];  
        for(i = 1; i < n; i++){  
            scanf("%d",&a[i]);  
            for(j = 0; j <= k; j++){  
                if(b[j] > a[i]){  
                    b[j] = a[i];  
                    break;       
                }     //导弹的拦截高度大于来的导弹的高度   
            }  
            if(j > k){   //新增一个拦截系统   
                b[++k] = a[i];  
            }  
        }  
        printf("%d\n",k+1);  
    }  
    return 0;  
}  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值