zoukankan      html  css  js  c++  java
  • 带分数

    带分数

    数字1~9分别出现且只出现一次这类题目:把9个数分成题目要求的几份即可。再通过sprintf把每个部分拼接起来,成为s字符串。最后判断字符串即可。提示:长度为9,排序后是“123456789”。如果枚举超时可以考虑再多写一个函数,舍去有0的情况、有重复数字的情况。

    参考博客:https://blog.csdn.net/karry_zzj/article/details/69656441

    例题如下:

     

      蓝桥杯历届试题 带分数  

     

    时间限制:1.0s   内存限制:256.0MB

     

    锦囊1
    枚举或搜索。

     

    问题描述

    100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

    还可以表示为:100 = 82 + 3546 / 197。

    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

    类似这样的带分数,100 有 11 种表示法。

    输入格式

    从标准输入读入一个正整数N (N<1000*1000)

    输出格式

    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

    注意:不要求输出每个表示,只统计有多少表示法!

    样例输入1
    100
    样例输出1
    11
    样例输入2
    105
    样例输出2
    6
     
     
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int a,b,c,n,flag[10],f[10];
     5 char s[10];
     6 
     7 int che(int n)
     8 {
     9     do
    10     {
    11         flag[n%10]++;
    12     }
    13     while(n/=10);
    14     if(flag[0]!=0)
    15         return 0;
    16     for(int i=1; i<=9; i++)
    17     {
    18         if(flag[i]>1)
    19             return 0;
    20     }
    21     return 1;
    22 }
    23 int che1()
    24 {
    25     sprintf(s,"%d%d%d",a,b,c);
    26     if(strlen(s)!=9)
    27         return 0;
    28     sort(s,s+9);
    29     int t=1;
    30     for(int i=0; i<9; i++)
    31     {
    32         if(s[i]!=t+'0')
    33         {
    34             return 0;
    35         }
    36         t++;
    37     }
    38     return 1;
    39 }
    40 int main()
    41 {
    42 
    43     scanf("%d",&n);
    44     int ans=0;
    45     for(a=1; a<n; a++)
    46     {
    47         memset(flag,0,sizeof flag);
    48         if(!che(a))
    49             continue;
    50         for(int i=0; i<=9; i++)
    51         {
    52             f[i] = flag[i];//记录这时的flag,已将a中的每个数记录好
    53         }
    54         for(c=1; c<10000; c++)
    55         {
    56             for(int i=0; i<=9; i++)
    57             {
    58                 flag[i]=f[i];//清除到之前记录时的flag
    59             }
    60             b=(n-a)*c;
    61             if(!che(b) || !che(c))
    62                 continue;
    63             if(che1())
    64             {
    65                 ans++;
    66             }
    67         }
    68 
    69     }
    70     printf("%d
    ",ans);
    71     return 0;
    72 }
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/weixq351/p/9588991.html
Copyright © 2011-2022 走看看