每日算法(五) PAT 乙级 例题

一、A+B和C 

给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。
解析:题目的难度不高,有几点需要注意一下:1. 数值的大小范围,选取类型,这里数值过大所以用Long Long 类型

2. 如果直接用相加的方式然后与c去比较还是有可能溢出,所以我们采用C-B与A比较,来确定A+B是否大于C

3.就是输出的结果的样式,一定要注意大小写

以下是我的代码:


#include
#include
typedef long long LL;
using namespace std;
int main() {

    int i;
    scanf("%d",&i);
    LL nums[10][3]={{0,0,0}};
    bool isBig[10];
    for( int j = 0 ; j < i ; j++ ) {
        scanf("%lld%lld%lld",&nums[j][0],&nums[j][1],&nums[j][2]);
        if((nums[j][2] - nums[j][1]) < nums[j][0])
            isBig[j] = 1;
        else
            isBig[j] = 0;

    }
    char t[] = "true";
    char f[] = "false";
    for( int j = 0 ; j < i ; j++ ) {

        printf("Case #%d: %s\n",j+1,isBig[j]?t:f);
    }
    return 0;
}

二、数字分类

给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:



A1 = 能被5整除的数字中所有偶数的和;

A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;

A3 = 被5除后余2的数字的个数;

A4 = 被5除后余3的数字的平均数,精确到小数点后1位;

A5 = 被5除后余4的数字中最大数字。
解析:题目很简单, 要注意的一点就是A4的输出需要精确到小数点后1位,这个我们可以使用%.1f这样输出,但是前提是double类型,切记int 类型除以int类型 如果你不进行强制转换,即使用来接收的是double类型都没用,所以一定要加上类型的转换。还有一点就是,在这里我是通过又创建了一个bool类型的数组,对应的去表明他们是否有无。

代码如下:



#include
#include
#include
using namespace std;

int main() {
	
	int n;
	scanf("%d",&n);
	int nums[n];
	int res[5] = {0};
	bool flag[5] ={false};
	int count = 0;
	int count_2 = 2;
	bool isFirst = true;
	for( int i = 0 ; i < n ; i++ ) {
		scanf("%d",&nums[i]);
		switch(nums[i] % 5) {
			case 0:
				if(nums[i] % 2 == 0) {
					res[0] += nums[i];
					flag[0] = true;
				}
				break;
			case 1:
				if(count_2 % 2 == 0) {
					res[1] += nums[i];
				}else {
					res[1] += -nums[i];
				}
				count_2++;
				flag[1] = true;
				break;
			case 2:
				res[2]++;
				flag[2] = true;
				break;
			case 3:
				res[3] += nums[i];
				flag[3] = true;
				count++;
				break;
			case 4:
				if(isFirst) {
					res[4] = nums[i];
					isFirst = false;
				}else {
					if(nums[i] > res[4])
						res[4] = nums[i];
				}
				flag[4] = true;
				break;
		}
	}
	for( int i = 0 ; i < 5 ; i++ ) {
		if(flag[i]) {
			if(i == 3) {
				double x = (double)res[i] / count;
				printf(" %.1f",x);
			}
			else if( i == 0 ) 
				printf("%d",res[i]);
			else {
				printf(" %d",res[i]);
			}
		}else {
			if( i == 0 ) 
				printf("%c",'N');
			else {
				printf(" %c",'N');
			}
		}
	}
	return 0;
}

三、数素数

令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
分析:    对于素数的选择常见的有两种做法,一种是通过判断是否只有自己和1以外的因子,来判断是否是素数,这个的实现可以通过循环遍历,来进行实现。第二种是素数筛选法详细的可以百度搜一下,但是他适合于求一个范围内的素数是那些。对于这题,我是用第二种,用的是第一种,但用第一种的效率太低,提交答案超时,因此我又稍微改进了了一下循环的次数变成了根号下N,来进行判断素数,效果还不错

代码如下:



#include
#include
#include
using namespace std;
int sushu[10000] = {0};
int isSu(int n) {
    for(int i = 2 ; i  <= sqrt(n); i++) {
        if(n%i == 0) {
            return 0;
        }
    }
    return 1;
}
int main() {
    int num = 2;
    int range[2] = {0};
    scanf("%d %d",&range[0],&range[1]);
    int k = 0;
    while(k < range[1]) {
        if(isSu(num++)) {
            sushu[k] = num-1;
            k++;
        }
    }
    int p = 1;
    for( int i = range[0]-1; i < range[1] ; i++) {
        if(p%10 == 1) {
            printf("%d",sushu[i]);
        }else {
            if(p%10 == 0) {
                printf(" %d\n",sushu[i]);  
            }else {
                printf(" %d",sushu[i]);
            }
             
        }
        p++;
    }
    return 0;
}







你可能感兴趣的:(C++,算法)