acm入门练习心得

时间:2024-01-04 12:46:38

A题  两数相加等于n相乘等于m 问是否存在两数

写了超级久没有写出来,因为我的思路是 把m的因子都找出来,加加看,看等不等于n。后来发现m的因子还要考虑负数的情况,还要考虑m是不是负数的情况。太过麻烦,显然出错了。

实际上,可以用较为简单的方法,来解这个二元方程有没有整数解即可。最后只需要判断一个一元二次方程有没有整数解即可。

判断这个解是不是整数的方法可以是: if((y-(int)y)==0)

D题 找到只出现奇数次的数

这是在新学了STL以后写的,之前考虑的算法是用二重循环,但是显然会超时。于是想到了用STL里的sort函数。建立了一个数组存储了所有的数据以后,使用sort函数,然后循环判断这个数和之后的数是否相等,由此计算这个数的个数,找到奇数的情况就输出。特殊情况是数组的最后一个,所以先判断是否已经到了最后一个。

一次性A了很开心

这道题和校赛的毒姐的情侣装很类似,当时也没写出来,应该还可以用异或来判断。之后可以再考虑怎么写。

E题 只取一个数的后两位做加法运算

挺简单的一题,就用%=就可以了

F题 一个数十进制的各位之和等于十六进制的各位之和等于十二进制的各位之和

用一个temp来存储这个数,对这个数%10/10直到他不等于0(十六十二进制同理)求得这三个进制各位数相加之和

G题 找到把一个10000以内的偶数拆分成两个不同的素数的不同拆分方法的次数

想到每次判断小于这个偶数的素数,但是显然太麻烦了,考虑到偶数在10000以内,就百度了10000以内的素数表,存在了数组里。

循环判断是否有两个相加等于这个偶数

本来的写法是

for(j=0;j<1229&&j!=i;j++)
{
if (other ==prime[j]&&j!=i)
cnt++;
}
 
}
printf("%d\n",cnt);

原意是想把j从0到1228都判断一下,然后排除等于i的情况,在把cnt/2输出

但是发现这样想第一个问题是j判断到i就结束了

经zcx提醒,发现其实确实只用判断到i就可以了,这样的话cnt也不用/2

H题 一个整数不知道最后两位数,知道它可以被某数除尽,算这个数最后两位可能是什么

前面的结果算出来挺容易的,难的是题目的要求是,每个数之后有一个空格最后一个数之后没有空格,这个问题其实挺常见的之前有一题也是这个原因

这样的话就不能直接循环的时候加入空格了

方法是:用一个flag先定为0,输出第一个数之后改为1,之后每次输出数字之前加一个空格。

还有一个要注意的问题是当这个数小于10时前面要用0补足

I题 算出第n各斐波那契数

本来想用一个函数做递归,但是超时了。改成循环以后就不会超时了。

因为之后数字变得很大,所以要用到longlong。

J题 找到最高的人

很简单,就找最大值就好了。

N题 a能否被b整除

很简单,略。

R题 计算坐标上两个点与原点相连的夹角大小

用向量中计算cos的做法,算出cos。再用acos()函数算出角度,因为acos()函数返回值是弧度制,所以要*180/3.1415826

错误出现在,这两个点的坐标是实数

S题 输入11位手机号,以6+最后五位作为短号

定义了一个数组,存储这11位数字

然后输出6,再从i=6开始循环输出剩下的数

感想:感觉自己有的时候写题目非常糙,都是没考虑清楚细节乱来。经常不够耐心,都还没有调试就随便提交代码。

师阳大神实在是很厉害,他都是哪里来的这么多时间A题的

在俱乐部的一周,觉得自己腰酸背痛,特别困特别累饿的特别快。感觉脑子都不太好用了,非常担心自己头发要掉光了,所以赶紧买了点坚果补一下...