两道纯数学题,可用暴力求解
一:困扰我很久的除法;输入正整数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;
}