hdu 1725(Find minimal sum)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1725

思路:几天前看到过这道题,当时没什么想法,今天心血来潮,就想尝试一下,1Y...orz...

一开始先打个表,把13以内的阶乘都算出来,然后二分查找,二分查找的时候如果没有找到相等的,返回的位置是后一个。。。这样循环就可以了。

View Code
 1 #include<iostream>
 2 using namespace std;
 3 int facs[13]={0,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};//打表找出前12个的阶乘
 4 
 5 int Binary_Search(int low,int high,int number){
 6     while(low<=high){
 7         int mid=(low+high)/2;
 8         if(facs[mid]==number)return mid;
 9         else if(facs[mid]>number)high=mid-1;
10         else low=mid+1;
11     }
12     return low;
13 }
14 
15 int main(){
16     int n;
17     scanf("%d",&n);
18     while(n--){
19         int m,summin=0;
20         scanf("%d",&m);
21         while(m){
22             int pos=Binary_Search(0,12,m);//二分
23             //相等的话就要退出
24             if(facs[pos]==m){
25                 summin+=1;
26                 break;
27             }else {
28                 summin+=m/facs[pos-1];
29                 m%=facs[pos-1];
30             }
31         }
32         printf("%d\n",summin);
33     }
34     return 0;
35 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值