暴力求解法

xiaoxiao2021-02-28  131

简单枚举

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]){ flag[s1]=1; s1/=10; } else break; if(!flag[s2]){ flag[s2]=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; }
转载请注明原文地址: https://www.6miu.com/read-58847.html

最新回复(0)