程序设计基础(基于c语言) 1-50

断断续续刷了两个月eoj,在此记录一些做题时遇到的问题及总结的经验。

通用经验

  1. 对于一个样例多个case,读一个输一个即可。
  2. 若规定样例为n个,在一开始读入n,然后while(n–)循环。
  3. 若未规定样例个数且若读入字符串其中不包含空格,用EOF结束循环读入。
  4. 多组数据注意:数组清零,输出换行,每轮循环初始化结果。
  5. 有时为避免内存溢出数组可以稍微开大一点。

1002*. 文本的查找与替换

  • 题目摘要:
    输入一行原文本,再输入待修改的子串以及修改后的子串(不包含空串或空白字符),对这行原文本执行查找和替换操作,输出查找到子串的次数,将查找到的子串全部替换成为修改后的子串,输出替换后的文本。
  • keypoint:
    不需要修改原文本,仅需在一般情况下输出原文本,若查找到待修改字串则输出修改后子串。

1073. 几位数?

  • 题目摘要:
    每行输入一个非负整数,这个非负整数不会超过 1024 位。每行只输出一个正整数,为对应的非负整数的位数。
  • keypoint:
    该整数可能超过long long,所以不能使用数字类型,应该使用字符数组读入。

2008. 查询

  • 题目摘要:
    首先输入一个数m,表示将给你m个数,接下来m行,每行一个数x。然后输入一个数n,表示将给你n个数,接下来n行,每行一个数x。判断x是否给过。
  • keypoint:
    初始化一个长度大于x范围的标记数组,所有元素均为0。若给了某数则把数组中下标为该数的数设为1。

1603. Sir Bedavere’s Bogus Division Solutions

  • 题目摘要:
    找出所有三位数分数组合,使得分子去掉最后一位数得到的两位数与分母去掉第一个数得到的两位数的结果与原结果相等。省略所有xxx/xxx=xx/xx形式的结果。按照分子从小到大排列。
  • 本人算法:分子分母分别为a,b。设其前两个数字组成的两位数分别为i, j,分母的第一位为n。易知10<=i<j<=99。两重嵌套循环遍历i, j。计算a, b并判断其是否满足条件。该算法需循环90*45次。
  • 更优算法:分子为abc,分母为cdd。10<=ab<=99,且a!=b。对ab从10到99循环,再对c从1到9进行循环,对于每一个符合条件的结果有(ab10+c)/(c100+dd)==ab/dd,计算出dd如果为整数且10<=dd<=99,则这些数的组合满足条件。该算法循环90*10次。(这个优秀的算法来自eoj用户@xsgxsg,侵删。)

1858. digits fun!

  • 题目摘要:You enjoy working with numbers that contain only square digits (namely 0, 1, 4, 9) The sequence containing only these digits is 0, 1, 4, 9, 10, 11, 14… output the N-th term (indexed from 0) in this sequence.
  • 个人算法:一个含有四个元素’0‘,’1‘,’4‘,’9‘的字符数组,对于读入的每个n递归输出数组下标为n/4的元素。

1034. finger counting

  • 题目摘要:小男孩数手指,从大拇指数到小手指再数回去,有一根手指是weakfinger(1<=weakfinger<=5),只能数n次,求最多能数多少次手指。
  • 个人算法:分情况讨论,在脑子里初始化一个数组,每个元素为一个来回每次数到的手指编号。wf为1或5为一种情况,其他值为另一种情况,后一种情况中根据n为奇偶分类讨论。

1950. least common multiple

  • 题目摘要:求出几个数的最小公倍数。
  • keypoint:
    • 最小公倍数=两数乘积除以最大公约数
    • 最大公约数:辗转相除。用a除以b(a>b),若能够整除,则b为最大公约数,若不能则a=b,c等于余数,重新判断能否整除。

2053. 小强的生日

  • 题目摘要:有p人或q人平分蛋糕,最少要切多少块才能做到?(每块大小不一定相等,p, q互质)
  • keypoint:用p刀把蛋糕平分为p份,再用q刀把蛋糕平分成q份,因为pq互质所以其中最多有一刀重合,最终结果就很好算了。(若pq不互质则减去最大公因数)

1075. 迎评成功

  • 题目摘要:把一个球形蛋糕切n刀最多得到多少份
  • keypoint:
    f(3, n)=(m*m*m+5*m+6)/6。
    如果是切一个平面:
    f(2, n)=(m*m+m+2)/2。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值