51nod 0 和 5
2015-09-30 14:43
190 查看
题意:
给出一个由0和5构成的数组,让这些数自由组合,求出能够组成的能被90整除的最大的数,不存在则输出-1。例如 5 5 0 这个数列可以组成 550 505 55 50这几个数,而其中没有能被90整除的数,输出-1
分析:
这个题目怎么解决呢?首先想到组成的这个数必须是以0结尾的,否则无论如何都不可能被90整除,那么我可以把问题化简成被9整除的数(因为在除的时候上下同时除以10)那么被9整除的数有什么性质呢?QAQ。。。。。这是我们想到9=3*3;3的倍数的各位数之和相加是3的倍数。这是我们猜想9也有相同的性质,因为把九分解成3*3那么能整除的话上面的数必须是 x*3 这个形式的。x的各位数相加是3的倍数,再乘以3,那么就是被9整除的数。那假设我们现在的到了这个数,我们现在只知道这个数的各位数相加的和,此时我们发现0对这个数没有影响,所以我们检查是否存在所有5相加得的数是不是9的倍数即可。有的话我们把5从前面输出(为了保证这个数最大,所有的0必须在后面),这样就是想法了。
程序:
给出一个由0和5构成的数组,让这些数自由组合,求出能够组成的能被90整除的最大的数,不存在则输出-1。例如 5 5 0 这个数列可以组成 550 505 55 50这几个数,而其中没有能被90整除的数,输出-1
分析:
这个题目怎么解决呢?首先想到组成的这个数必须是以0结尾的,否则无论如何都不可能被90整除,那么我可以把问题化简成被9整除的数(因为在除的时候上下同时除以10)那么被9整除的数有什么性质呢?QAQ。。。。。这是我们想到9=3*3;3的倍数的各位数之和相加是3的倍数。这是我们猜想9也有相同的性质,因为把九分解成3*3那么能整除的话上面的数必须是 x*3 这个形式的。x的各位数相加是3的倍数,再乘以3,那么就是被9整除的数。那假设我们现在的到了这个数,我们现在只知道这个数的各位数相加的和,此时我们发现0对这个数没有影响,所以我们检查是否存在所有5相加得的数是不是9的倍数即可。有的话我们把5从前面输出(为了保证这个数最大,所有的0必须在后面),这样就是想法了。
程序:
#include<cstdio> #include<algorithm> using namespace std; int main(void){ int n,i,sum,cnt,a; while(scanf("%d",&n)!=EOF){ sum=0;cnt=0; for(i=0;i<n;i++){ scanf("%d",&a); if(a==5) sum+=5; else cnt++; } while(sum%9!=0) sum-=5; if(cnt==0){ printf("-1\n"); continue; } if(sum==0){ printf("0\n"); continue; } do{ printf("5"); sum-=5; }while(sum); for(i=0;i<cnt;i++){ printf("0"); } printf("\n"); } }
相关文章推荐
- C# 隐式接口与显式接口实现
- 日期计算
- c++实现单向链表
- Hibernate的条件查询的几种方式
- MFC模拟点击其他程序的模态消息提示框的“确定”按钮
- msyql 的myisam存储引擎大表建立分区和索引总结
- Android SlidingMenu 滑出侧边栏
- Android性能调试工具使用
- delphi线程中操作access数据库经常报内存地址错误解决方法
- 帧缓冲相关数据结构整理(设备驱动开发详解)
- window时间同步机制的简单介绍
- LintCode "Maximum Subarray II"
- Microsoft Visual Studio 2010(VS2010)秘钥
- ThinkPHP中实例化对象M()和D()的区别?ThinkPHP如何实例化对象?
- iOS 分段选择控件 开关按钮 滑杆
- windows中使用Git工具连接GitHub(配置篇)
- 常见的mysql 进程state
- Mac 下 Chrome 浏览器 快捷键
- (转)关于《中国IM云产品性能测试报告2015》严重漏洞的声明
- Spring实现AOP的方式