暴力求解

   两道纯数学题,可用暴力求解

一:困扰我很久的除法;输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a-j恰好为数字0到9的一个排列,2<=n<=79.
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

bool vis[10];
char str[15];
int n,ans;

bool check(int x,int y)
{
   sprintf(str,"%05d%05d",x,y);
   memset(vis,0,sizeof(vis));
   for(int j=0;j<10;j++)
   {
       if(vis[str[j]-'0']) return false;
       vis[str[j]-'0']=true;
   }
   return true;
}

void solve()
{
  bool exist=false;
  for(int i=1234;i<=98765;i++)
   {
    if(i%n==0){
    ans=i/n;
    if(ans<1234) continue;
    if(check(i,ans))
    exist=true,printf("%05d / %05d = %d\n",i,ans,n);
    }
   }
 if(!exist)
  printf("There are no solution for %d.\n",n);
}


int main()
{
    while(~scanf("%d",&n))
    solve();
    return 0;
}

二:用1,2,3,4,。。。9排成三个三位数abc,def,ghi,每个数字恰好使用一次,要求abc: def: ghi=1 :2: 3。按照“abc def ghi”的格式输出所有解。


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a,b,c;
bool vis[10];
char str[15];


bool check(int x,int y,int z)
{
   sprintf(str,"%d%d%d",x,y,z);
   memset(vis,0,sizeof(vis));
   for(int j=0;j<9;j++)
   {
       if(vis[str[j]-'0']) return false;
       vis[str[j]-'0']=true;
   }
   return true;
}


void solve()
{
    bool exist=false;
    for(int a=123;a<345;a++)
    {
        b=2*a,c=3*a;
        if(c>999) continue;
        if(check(a,b,c))
            exist=true,printf("%d %d %d\n",a,b,c);
    }

}

int main()
{
    solve();
    return 0;
}

三。递归思想 Hanoi塔问题,假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C并按同样的顺序叠排.圆盘移动必须遵守下列规则:
1:每次只能移动一个圆盘 2:圆盘可以插在任意一个塔座上 3:任何时刻都不能将一个较大的圆盘放在一个较小的圆盘上.


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int n;
char A,B,C;

void Hanoi(int n,char A,char B,char C)
{
    if(n==1) printf("%c->%c ",A,C);//边界条件(递归终止条件)
    else{
        Hanoi(n-1,A,C,B);
        printf("%c->%c ",A,C);
        Hanoi(n-1,B,A,C);
        }
}

int main()
{
   while(~scanf("%d",&n))
    Hanoi(n,'A','B','C');
    return 0;
}

四。按照字典序生成1~n的全排列,递归思想:


#include <iostream>
#include <cstdio>
#include <algorithm>
#define maxn 10005

int A[maxn],n,cur;

void print_permutation(int n,int* A,int cur)
{
   if(cur==n){
    for(int i=0;i<n;i++) printf("%d ",A[i]);
    printf("\n");
   }
   else for(int i=1;i<=n;i++){
    int ok=1;
    for(int j=0;j<cur;j++)
        if(A[j]==i) ok=0;
    if(ok){
        A[cur]=i;
        print_permutation(n,A,cur+1);
    }
   }
}


int main()
{
    while(~scanf("%d",&n))
        print_permutation(n,A,0);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值