Uva(Digit Generator,1583) 生成元
2016-01-28 19:49
375 查看
题目大概是这样:
如果x加上x的各位数之和等于y,就说x是y的生成元.
给出n(1<=n<=100000),求n的最小生成元, 无解输出0.
例如 n=216,121,2005 应输出 198 0 1979
当然,拿到题目我第一反应是枚举,确实我使用枚举AC了。。
并不是枚举1-n. x=(n的位数)*9.. 枚举(n-x,n)即可
比如 216 只需要枚举(n-3*9,n)..这是显然的。
直接上代码,尽管写的很挫。
离线做法: 高效率
如果不妥,还望指出。
题目大概是这样:
如果x加上x的各位数之和等于y,就说x是y的生成元.
给出n(1<=n<=100000),求n的最小生成元, 无解输出0.
例如 n=216,121,2005 应输出 198 0 1979
当然,拿到题目我第一反应是枚举,确实我使用枚举AC了。。
并不是枚举1-n. x=(n的位数)*9.. 枚举(n-x,n)即可
比如 216 只需要枚举(n-3*9,n)..这是显然的。
直接上代码,尽管写的很挫。
#include"cstdio" #include"cstdlib" #include"cstring" #include"algorithm" #include"iostream" using namespace std; int data[10]; int main() { int n; int times; scanf("%d",×); for(int k=0;k<times;k++) { scanf("%d",&n); int cnt=0; //统计多少位 int tem=n; while(tem) { cnt++; tem/=10; } int ok=0; for(int i=n-cnt*9;i<=n;i++) { int sum=i; tem=i; while(tem) { sum+=tem%10; tem/=10; } if(sum==n) { ok=1; printf("%d\n",i); break; } } if(!ok) printf("0\n"); //无解 } return 0; }
离线做法: 高效率
#include"cstdio" #include"cstring" const int maxn=100000+5; int ans[maxn]; void solve() //离线做法 { memset(ans,0,sizeof(ans)); for(int i=1;i<maxn;i++) { int x=i,y=i; while(x){y+=x%10;x/=10;} if(ans[y]==0||i<ans[y]) ans[y]=i; } } int main() { int T,n; solve(); scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%d\n",ans ); } }
如果不妥,还望指出。
相关文章推荐
- [Windows]_[初级]_[监听指定目录文件夹中文件的变化]
- AJAX中XMLHttpRequest对象详解(3)
- Linux压缩与解压
- jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding
- 走出森林的2015,开启我的新征程
- 各种工厂
- python中的time模块
- 时间问题
- 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
- UI视图挖坑
- 使用EXCEL设置“下拉菜单”选项功能
- 网站从无到有--个人(第一次)搭建。服务器环境搭建 对大家有帮助那就最好-第一次发
- gzip: stdin: invalid compressed data--format violated 解决
- Flask
- __asm__ volatile 之 C语言嵌入式汇编
- 平行越权
- Django实践:个人博客系统(第十五章 重构代码)
- 换行和回车野史
- 【Spark1.6官方翻译】Spark快速入门
- vi/vim使用进阶: lookupfile插件