博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 1019 Number Sequence 组合数学 找规律
阅读量:7071 次
发布时间:2019-06-28

本文共 5574 字,大约阅读时间需要 18 分钟。

我自己也搞不清为什么分到组合数学里面去。一个找规律+递推的题目;才开始我也是理解错了题目以为求i位置下的数呢,题目要求的是第i个位置下的数字只能是0-----9了。WA了好几次才发现。

首先根据((1 + x)*x)/2 = 2147483647 估算到达65537肯定超过2147483647各数字。所以只要计算1到65537的各位数字即可。

a[i]存第i行 1到i有多少个数字 sum[i]记录的是1 -- i 行总共有多少数字。首先根据sum确定i位置在那一行(按i分行,如下),然后在求在这一行的位置

1

1 2

1 2 3

1 2 3 4

.....

才开始不知到可以直接用log10(1.0*i) + 1求i的10进制书有多少位,所以我就分类枚举过得,后来游泳公式写了一下。

枚举的:

View Code
#include 
#include
#include
#define maxn 65539using namespace std;long long a[maxn],sum[maxn],n;int main(){ //freopen("in.txt","r",stdin); int i,t; memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); for (i = 1; i < maxn; ++i) { a[i] = a[i - 1] + 1; if (i >= 10) a[i]++; if (i >= 100) a[i]++; if (i >= 1000) a[i]++; if (i >= 10000) a[i]++; } for (i = 1; i < maxn; ++i) sum[i] = sum[i - 1] + a[i]; scanf("%d",&t); while (t--) { scanf("%lld",&n); int pos; for (i = 0; i < maxn; ++i) { if (n > sum[i] && n <= sum[i + 1]) { pos = i + 1; break; } } //printf("POS = %d\n",pos); if (n == sum[pos]) { printf("%d\n",pos%10); } else { long long ct = sum[pos - 1]; //printf("<><><><%lld\n",ct); for (i = 1; i <= pos; ++i) { if (i >= 10 && i <= 99) { if (ct + 1 == n) { printf("%d\n",(i/10)%10); break; } else if (ct + 2 == n) { printf("%d\n",(i%10)); break; } else ct += 2; } else if (i >= 100 && i <= 999) { if (ct + 1 == n) { printf("%d\n",(i/100)%10); break; } else if (ct + 2 == n) { printf("%d\n",(i/10)%10); break; } else if (ct + 3 == n) { printf("%d\n",(i%10)); break; } else ct += 3; } else if (i >= 1000 && i <= 9999) { if (ct + 1 == n) { printf("%d\n",(i/1000)%10); break; } else if (ct + 2 == n) { printf("%d\n",(i/100)%10); break; } else if (ct + 3 == n) { printf("%d\n",(i/10)%10); break; } else if (ct + 4 == n) { printf("%d\n",(i%10)); break; } else ct += 4; } else if (i >= 10000 && i <= pos) { if (ct + 1 == n) { printf("%d\n",(i/10000)%10); break; } else if (ct + 2 == n) { printf("%d\n",(i/1000)%10); break; } else if (ct + 3 == n) { printf("%d\n",(i/100)%10); break; } else if (ct + 4 == n) { printf("%d\n",((i/10)%10)); break; } else if (ct + 5 == n) { printf("%d\n",(i%10)); break; } else ct += 5; } else { if (ct+ 1 == n) { printf("%d\n",i); break; } else ct++; //printf(">>>>%lld %d\n",ct,i); } } } } return 0;}

调用公式:

View Code
#include 
#include
#include
#include
#define maxn 65539using namespace std;long long a[maxn],sum[maxn],n;int main(){ //freopen("in.txt","r",stdin); int i,t; memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); for (i = 1; i < maxn; ++i) { a[i] = a[i - 1] + (int)log10(1.0*i) + 1; } //for (i = 1; i <= 20; ++i) printf("%d ",a[i]); //printf("\n"); for (i = 1; i < maxn; ++i) sum[i] = sum[i - 1] + a[i]; scanf("%d",&t); while (t--) { scanf("%lld",&n); int pos; for (i = 1; i < maxn; ++i) { if (n <= sum[i]) { pos = i; break; } } if (n == sum[pos]) { printf("%d\n",pos%10); continue; } int len = 0; int ct = n - sum[pos - 1]; //printf("%d %d\n",ct,pos); for (i = 1; len < ct; ++i) { len += ((int)log10(1.0*i) + 1); } //printf(">>%d\n",i); printf("%d\n",((i - 1)/(int)pow(10*1.0,1.0*(len - ct)))%10); } return 0;}

转载地址:http://rihll.baihongyu.com/

你可能感兴趣的文章
Java基础加密之MD5加密算法
查看>>
盛夏光年
查看>>
Android 沉浸式状态栏(像IOS那样的状态栏与应用统一颜色样式)
查看>>
RHCS集群服务 7.10
查看>>
windows 使用vnc图形化界面远程连接阿里云ubuntu 16.04云服务器
查看>>
linux和CentOS是什么关系;CentOS和RHEL是什么关系
查看>>
samba
查看>>
利用Python网络爬虫抓取微信好友的签名及其可视化展示
查看>>
Linux-Nginx代理
查看>>
计算机的系统组成简介---运维笔记
查看>>
Liunx nginx 的使用方法及模块
查看>>
DBA——表级数据恢复之路(一) 请下载附件查看
查看>>
自定义弹出框
查看>>
如何扩展ESXi虚拟机磁盘容量
查看>>
sqlserver 登录方式修改,由默认的windows账户改为用sa等sql server账户登录
查看>>
Apache+tomcat 快速部署Java环境
查看>>
获取Android控件尺寸
查看>>
强大的命令行工具wmic
查看>>
Powershell通过变量、数组批量添加DHCP保留地址
查看>>
引导过程和服务控制
查看>>