简单枚举
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;
}