暴力求解法_简单枚举(除法,最大乘积法,分数拆分,双基回文数)

简单枚举

1 除法

题目:输入正整数n,按从小到大输出所有形如abcde/fghij=n的表达式。其中a~j为0~9的一个排列,2=
输入:
62
输出:
79546/01283=62
94736/01528=62
code:
#include <stdio.h>
#include<string.h>
int main() {
    int i,j,n,s1,s2,flag[10];
    while(scanf("%d",&n)!=EOF){
        for(i=1234;i<50000;i++){
            memset(flag,0,sizeof(flag));
            //flag保存每一个数字是否使用,一开始初始化为0
            s1=i;s2=i*n;
            while(s1||s2){
                if(!flag[s1%10]){
                    flag[s1%10]=1;
                    s1/=10;
                }
                else break;
                if(!flag[s2%10]){
                    flag[s2%10]=1;
                    s2/=10;
                }
                else break;
            }
            for(j=0;j<10;j++){
                if(!flag[j]) break;
            }//判断是个不同数字是否存在
            if(j==10 && i*n<=98765){//如果数字各不相同
                if(i<10000)
                    printf("%d / 0%d\n",i*n,i,n);
                else
                    printf("%d / %d\n",i*n,i,n);
            }
        }
    }
    return 0;
}

2 最大乘积法

题目:输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是正数,应输出-1(表示无解)。1<=n<=18,-10<=Si<=10。
输入:
3
2 4 -1
5
2 5 -1 2 -1
输出:
8 
20
code:
#include <stdio.h>
long long int i,n,j,max;
long long int s[20],a[20];
int main() {
    while(scanf("%lld",&n)!=EOF){
        s[0]=1;

        for(i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            s[i]=s[i-1]*a[i];
        }//把所有的乘积全部算出来
        max=s[i-1];
        for(i=1;i<=n;i++){
            for(j=i;j<=n;j++){
                if(s[j]/s[j-i]>max)//对比是否要删除
                    max=s[j]/s[j-i];
            }
        }
        if(max<0) max=-1;
        printf("%lld\n",max);
    }
    return 0;
}

3 分数拆分

题目:输入正整数k,找到所有的正整数x>=y,使得1/k=1/x + 1/y;
输入:
2
12
输出:
2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24
code:(泪牛满面,终于自己写一道)
虽然不知道弄的好不好hhhhhhhh
#include <stdio.h>
int main() {
    double x,y,k;
    int i,count;
    double a[1000],b[1000];
    while(scanf("%lf",&k)!=EOF){
        count =0;
        for(i=2;i<=2*k;i++){
            if((i-k)>=0){
            x=k*i/(i-k);
            if(int(x)==x){
                b[count]=x;
                a[count]=i;
                count++;
//              printf("1/%.lf = 1/%.lf + 1/%.lf\n",k,x,i);
                }
            }
        }
        if(count!=0){
            printf("%d\n",count);
            for(i=0;i<count;i++){
                printf("1/%.lf = 1/%.lf + 1/%.lf\n",k,b[i],a[i]);
            }
        }
    }
    return 0;
}

4 双基回文数

题目:如果一个正整数n至少在两种不同的进制下b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意,回文数不能包含前导零)。输入正整数S<10^6,输出比S大的最小的双基回文数。
输入: 1600000
输出: 1632995
分析:最自然的想法就是:从n+1开始依次判断每个数是否为双基回文数,而在判断时枚举所有可能的基数(2~10),一切都是那么的“暴力”。令人有些意外的是:这样做对于S<10^6这样的“小规模数据”来说是足够快的——双基回文数太多太密了。
code:
#include<stdio.h>
int a[30];
int huiwen(int s[],int n) /*判断是否回文*/
{
    int i;
    for(i=0;i<=n/2;i++)
    {
        if(a[i]!=a[n-i])
        {
            return 0;
            break;
        }
    }
    return 1;
}
int converse(int n,int k) /*把十进制的n转化为k进制*/
{
    int flag=0,i,j=0;
    while(n)
    {
        a[j++]=n%k;
        n/=k;
    }
    if(huiwen(a,j-1))
      flag=1;
    if(flag)  /*n在k进制下是回文数*/
      return 1;
    else
      return 0;
}
int main()
{
    int i,j,k,n,cnt;
    while(scanf("%d",&n)!=EOF)
    {
        for(j=n+1;;j++)
        {
            int p=0;
            for(i=2,cnt=0;i<=10;i++)
            {
                if(converse(j,i))
                   cnt++;  /*记录回文次数*/
                if(cnt>=2)  /*是双基回文数*/
                {
                    p=1;
                    break;
                }
            }
            if(p)
            {
                printf("%d\n",j);
                break;
            }
        }
    }
    return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值