SWJTU 有价值的题目-1001 不幸的程序猿

不幸的程序猿

先来看看题目
1001:不幸的程序猿
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
程序猿是一种近几十年来出现的新物种,是工业革命的产物。英文(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非常悲剧的存在。
最新的研究显示,程序猿有一大特点:易猝死。因为程序猿们常常改变自身的生物钟,给身体带来了不幸。为了长命百岁,程序猿们多保重身体,不要老是加班,熬到深夜!
最近,又传来了一个噩耗,某程序员不幸劳累去世,留下了下面的代码:
这里写图片描述
事后调查发现,该程序猿是因为日夜等待上段代码的运行结果,而……你接替了他的工作,聪明的你知道:“如果不找到另一种方法达到上段代码的功能,我也会……”。于是,你决定,重新写一段代码,能输出和这段代码一样的结果。

输入
输入第一行是一个正整数 rep(值不超过100),其含义参见上述代码;对于每一组测试数据,仅包含一个正整数 n(值不超过1,000,000,009),其含义参见上述代码。
输出
对于每一组测试数据,输出 sum 的值,其含义参见上述代码。
样例输入
3
1
2
3
样例输出
1
3
6
提示
直接复制并提交上述代码,会返回超时。

emmmm,很简单的一道题,发现了规律后一行代码就可以搞定
分析贴出的代码可知,题目中要求计算出从1到输入的数字n之间所有数的f(i)之和,所以关键就在于我们对f()函数的理解了
f()函数返回该数字每一位上的数字之和,如果累加得到的和超过10,则再求该和的各个数位之和,直至小于10为止,听上去很复杂,,,一开始做就陷入了这个坑久久不能自拔

稍加分析就会发现:该函数输出的数字肯定是在1-9之间,然后进一步发现规律,所有的数字经过该函数得到的数字呈规律变化123456789123456789123456789123…,所以只需要数出来有多少个循环,简单除一下再加上余数几位的和,就得到了答案
需要注意的是结果要求mod10000

最后附上AC代码:

#include <bits/stdc++.h>
#define fur(i,a,b) for(int i=(a);i<(b);i++)
#define furr(i,a,b) for(int i=(a);i>(b);i--)
#define max(a,b) ( ((a)>(b)) ? (a):(b) )
#define min(a,b) ( ((a)>(b)) ? (b):(a) )
#define cl(a, b) memset((a),1,sizeof(a))
#define Point int
#define null NULL
#define OFFSET 500000
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
const int N=1010;

const ll mod=10000;
using namespace std;


int main()
{
    int rep;
    scanf("%d",&rep);
    while(rep--)
    {
        ll n;
        scanf("%I64d",&n);
        int res = (((n/9)*45)%mod + (n%9+1)*(n%9)/2)%mod;
        printf("%d\n",res);
    }
    return 0;
}

最后感谢某位不知道愿不愿意透漏姓名的大佬指点走出旋涡…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值