[Swust OJ 179]--火柴棍(找规律)

 

题目链接:http://acm.swust.edu.cn/problem/0179/

 

Time limit(ms): 1000      Memory limit(kb): 65535
 
Description

火柴棍可以拼成10进制的数字,如图所示:

 


现在,gogo给你个n个火柴棍,要求你输出最小能拼成的数字和最大能拼成的数字。

 
Input

第一行输入一个整数T:T组测试数据(T<100)

每行输入一个n (2 ≤ n ≤ 100): 表示你有的火柴棍数。

 

Output

最小能拼成的数字和最大能拼成的数字, 用一个空格分开. 没有前导0.

 
 
Sample Input
4
3
6
7
15
Sample Output
7 7
6 111
8 711
108 7111111

 
 

 

解题思路:最大值就是凑成7或1,偶数根全为1,奇数根火柴拼一个7,至于最小值,我是找的规律前17根火柴直接找出来的(如下表)

     发现18根火柴得到最小208,19根288,20根688,满足x[i]=x[i-7]*10+8,提交了一下果然过了Orz~~~

01 2 3 4 5 6 7  8  91011121314151617
 0 0 1 7 4 2 6 810182220286888108188200

 

代码如下:

 1 #include <iostream>
 2 using namespace std;
 3 long long a[105] = { 0, 0, 1, 7, 4, 2, 6, 8, 10, 18, 22, 20, 28, 68, 88, 108, 188, 200 };
 4 void init(){
 5     for (int i = 18; i <= 105; ++i){
 6         a[i] = a[i - 7] * 10 + 8;
 7     }
 8 }
 9 int main(){
10     int t, n;
11     cin >> t;
12     init();//没有加这一句,将答案算出,贡献一次wa
13     while (t--)
14     {
15         cin >> n;
16         cout << a[n] << ' ';
17         while (n){
18             if (n & 1){
19                 cout << 7;
20                 n -= 3;
21             }
22             else{
23                 cout << 1;
24                 n -= 2;
25             }
26         }
27         cout << endl;
28     }
29     return 0;
30 }
View Code

 

转载于:https://www.cnblogs.com/zyxStar/p/4581926.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值