PAT A1048一个测试点未通过

本文介绍了一种使用散列数组解决硬币配对问题的方法,并详细讨论了如何避免数组越界问题,确保程序正确运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*用一个散列数组统计硬币各个价值个数,然后从小到大遍历,如果存在v1,则
检查m-v1是否也存在即可。这样也不需要排序了。 
*/
#include<cstdio>

int main(){
	int n,m;
	int value[1005]={0};//这里注意散列输足不能只开500.因为m是1-1000,m-它可能大于500 
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		int temp;
		scanf("%d",&temp);
		value[temp]++;
	} 
	for(int i=1;i<1005;i++){//从小面值开始遍历 
		if(value[i]!=0 ){
			value[i]--;//这个面值的金额就不能再用了 
			if( value[m-i]!=0){
				printf("%d %d\n",i,m-i);
				return 0;	
			}
	
		}
	}
	printf("No Solution\n");
	return 0;
}

在这里插入图片描述

  • 在做这道题的时候是用的散列方法,然后测试点1始终不能通过,百度之后觉得他们遇到的问题与我遇到的不一样。于是苦思冥想之后发现了如下问题。因为题中的m是小于1000,而硬币面值value是小于500,所以m-value可能大于500,数组首先大小不能只开到500,要开到1k或1w,因为用的是散列,所以不会花费太多时间。到这里并不能解决测试点1错误的问题。
       这里可以往这个方向思考,因为我的代码中
    在这里插入图片描述

  • 这一步可能出现问题,如果m比i小呢?,这样数组不就是负数了吗,但是负数不应该是0吗,我试了下输出在这里插入图片描述
    然后又写了段程序检测了下在这里插入图片描述

输出如下在这里插入图片描述

这里就不太懂了,数组越界之后的值就不一定是0,而是随机的?
所以把这道题的那一部分代码改为在这里插入图片描述
这样就能全部编译通过了!!!

百度了下,因为很多编译器对数组越界并不提示错误,而是顺利通过编译。当该数组越界范围超过进程的页表时,导致缺页,才会发生段错误,因为在往下的线性地址没有进行映射。(这里又不懂了…以后再说吧)

在这里插入图片描述

具体原因可参考下面文章:
https://blog.youkuaiyun.com/fushiqianxun/article/details/7548907?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值