赞
踩
本文章将持续更新一些简单的赛事题目,解题使用纯C语言,不涉及C++,因为我也是刚学习C语言,来练练提升自己水平。本文章的解题思路不会考虑算法的简洁性,以算法的简单优先,可能代码量大而简单,但是更易学习。
我会给每一行代码加上注释,适合像我一样的初学者学习。
A. 平方和
【问题描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574,平方和是 14362。注意,平方和是指将每个数分别平方后求和。
请问,在 1 到 2019 中,所有这样的数的平方和是多少?
答案:2658417853
看到很多大佬的解题思路真的简洁清晰,我来个更笨的枚举解题
思路:先用for循环1-2019的所有数字,把每一个数字转换成字符数组比如1转换成’1’ 100转化成’1’ ‘0’ ‘0’,再根据位数逐个判断是否包含‘2’ ‘0’ ‘1’ ‘9’
上代码:
#include
int main()
{
long long sum = 0; //创建一个长整数变量,用来存放平方和
for (long long a = 1; a<=2019; a=a++)//循环1-2019的每一个数字
{
char s[8];//创建字符数组,用于整数转换字符串的储存
sprintf(s, "%lld", a);//整数转换字符串
if (a<10)//下面的if都是循环判断每一个字符数组成员是否含有2,0,1,9
{
if (s[0]=='2' || s[0] == '0' || s[0] == '1' || s[0] == '9')
{
sum = a * a+sum;
}
}
if (a<100 && a>=10)
{
if (s[0] == '2' || s[0] == '0' || s[0] == '1' || s[0] == '9')
{
sum = a * a + sum;
}
else
{
if (s[1] == '2' || s[1] == '0' || s[1] == '1' || s[1] == '9')
{
sum = a * a + sum;
}
}
}
if ( a < 1000 && a >= 100)
{
if (s[0] == '2' || s[0] == '0' || s[0] == '1' || s[0] == '9')
{
sum = sum + a * a;
}
else
{
if (s[1] == '2' || s[1] == '0' || s[1] == '1' || s[1] == '9')
{
sum = sum + a * a;
}
else
{
if (s[2] == '2' || s[2] == '0' || s[2] == '1' || s[2] == '9')
{
sum = sum + a * a;
}
}
}
}
if (a < 10000 && a >= 1000)
{
if (s[0] == '2' || s[0] == '0' || s[0] == '1' || s[0] == '9')
{
sum = sum + a * a;
}
else
{
if (s[1] == '2' || s[1] == '0' || s[1] == '1' || s[1] == '9')
{
sum = sum + a * a;
}
else
{
if (s[2] == '2' || s[2] == '0' || s[2] == '1' || s[2] == '9')
{
sum = sum + a * a;
}
else
{
if (s[3] == '2' || s[3] == '0' || s[3] == '1' || s[3] == '9')
{
sum = sum + a * a;
}
}
}
}
}
}
printf("%lld", sum);
B. 数列求值
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求
第 20190324 项的最后 4 位数字。
答案:4659
思路:递推,每次都%10000 经过python尝试第一千项目已经达到下面的结果
10565699428369704222792849547500
98236519342255152919675406067018
21396074739381766709558872599594
89737224174222274775896140703938
20954716814070302286673551230293
56094067484636736752022453834248
26302070809058467686757909035536
45664897731604869996342518016379
904334431
所以只能%10000,不要计算全部位数!!!
上代码:
#include
int main()
{
long long a, b,c,d;//创建整数变量a,b,c分别表示后三项,d表示最后一项
a = 1; b = 1; c = 1; //初始赋值
for (int e=4; e <= 20190324; e++)//斐波那契数列
{
d = (a + b + c)%10000;//取余数计算即可,题目要求是后四位所以我们只需要计算后取后四位这样循环计算即可
a = b; b = c; c = d;
}
printf("%lld\n", d);
}
C. 最大降雨量
【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
答案:34
思路:emm,这是道数学题,刚开始我想把所有可能的排列都算出来,结果49的阶乘实在数据量太多计算机根本算不出。于是只能智取了,如图所示:
假设我们按照每一周的中位数的大小将每一周进行排列到1-7周
那么第四周的中位数就是降雨的能量,为了保证能量最大也就是我在图中画斜线的括号数字最大
而画圆圈的括号的数字一定要比画斜线的括号数字大,所以至少得有15个数比降雨的能量大
那就49-15=34,这就是降雨的最大能量了。但是代码怎么写,我也不知道,看来数学很重要呀
原文链接:https://blog.csdn.net/qq_33681342/article/details/109050250
站长简介:前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,关注我,做朋友, 我们一起谈人生和理想吧!我的公众号:想吃麻辣香锅
关注公众号回复充值+你的账号,免费为您充值1000积分
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。