• 数的分解


     

    Description

    把一个正整数N分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?

    注:不包含2和4指整数的各个位上的数都不为2且不为4。

    Input

    第一行一个整数T,表示输入有T组。

    对于每一组输入数据,输入为一个正整数N。(3 < N < 2020)

    Output

    对每组输入数据,输出一个正整数,表示分解方法。

    Sample Input

     
    3
    8
    9
    12

    Sample Output

     
    0
    1
    2
    

    More Info

    对样例的解释:

    8没有满足要求的分解。

    9分解为:1、3、5。

    12分解为:1、3、8或1、5、6。

     

     

    #include<iostream>
    //#include<fstream>
    using namespace std;
    bool check(int n){
        while(n){
              if(n%10==2||n%10==4){
                  return false;
              }
              n/=10; 
         }
        return true;
    }
    int main(){
         int n,a;
    //    fstream file("haha.txt");
     //    file>>n;
         cin>>n;
         int sum;
         while(n--){
         //    file>>a;
             cin>>a;
             sum=0;
             for(int i=1;i<a;i++){
                 if(check(i)){
                     for(int j=i+1;a-i-j>j;j++){
                         if(check(j)&&check(a-i-j)){
                             sum++;
                         }
                     }
                 }
             }
            cout<<sum<<endl;
         }
         return 0;
    }

     

    直接用暴力搜索法,直接搜可能会超时,要进行一些优化

    第一个数设成i,第二个数设成i+1,第三个数设成a-i-j,这样设置的原因是:

      1.因为题目说不能重复,

      2.要排除掉重复的结果,比如,对9进行分解的话,答案只有一种,就是1,3,5,但如果用无脑的搜索的话,答案会是6种,就会变成1,3,5的全排列,但题目中要求去除掉重复的。

    然后就是检验分解成的数是否符合条件,就是检验是否含有2和4,这很简单,假设要检验的数是n,就是n对10取模,这样能得到n这个数的个位上的数字,判断它是不是2或4,然后n=n/10,相当于舍弃掉了n个位上的数字,这样就能把n各个位上的数字都检验过来。

  • 相关阅读:
    国产CPU研究单位及现状
    大型网站用什么技术比较好,JSP,PHP,ASP.NET
    韩国企业百强排行榜!
    中国操作系统
    Visual C++2010开发权威指南 中文高清PDF
    printf以及各种变种
    SPDY以及HTTP2.0
    数字证书认证这点事, SSL/TLS,OpenSSL
    利用Fiddler,解密wireshark抓的HTTPS包
    C跟C++
  • 原文地址:https://www.cnblogs.com/fate-/p/12233220.html
Copyright © 2020-2023  润新知