1.除法
輸入正整數n,按從小到大的順序輸出所有形如abcde/fghij=n的表達式,a~j恰好爲數字0~9的一個排列 ,2<= n <= 79.
#include<cstdio>
#include<cstring>
int vis[10], a[10], n;
void dfs(int x)
{
if(x > 4)
{
int sum =0;
int i=0;
for(i=4; i>=0; i--)
sum = sum*10 + a[i];
int tmp=sum*n;
if(tmp >=100000)return;
for(i=5; i<10; i++)
{
a[i]=tmp%10;
tmp/=10;
}
for(i=0; i<9; i++)
for(int j=i+1;j<10;j++)
if(a[i] == a[j])
return;
for(i=9;i>=0;i--)
{
printf("%d",a[i]);
if(i==5)
printf("/");
}
printf("=%d\n",n);
return;
}
for(int i=0; i<10;i++)
if(!vis[i])
{
vis[i]=1;
a[4-x] = i;
dfs(x+1);
vis[i] = 0;
}
}
int main()
{
while(scanf("%d", &n) != EOF)
{
memset(vis, 0, sizeof(vis));
dfs(0);
}
return 0;
}
2.最大乘積
輸入n格元素組成的序列S,你需要找到一個乘積最大的連續子序列。如果這個最大的乘積不是正數,應輸出-1(表示無解)。1<=n<=18, -10 <= Si <= 10
#include<cstdio>
#include<climits>
int a[20];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
for(int m=0; m<n;m++)
{
scanf("%d",&a[m]);
}
long long max=LLONG_MIN;
long long sum=1;
int l,i,j,k;
for(l=1;l<=n;l++)
{
for(i=0;i<=n-l;i++)
{
j=i+l;
for(k=i;k<j;k++)
sum = sum*a[k];
if(sum > max)
max=sum;
sum=1;
}
}
if(max>=0)
printf("%lld\n",max);
else
printf("-1\n");
}
return 0;
}
3.分數拆分
輸入正整數k,找到所有的正整數x>=y,使得 1/k = 1/x + 1/y。
#include<cstdio>
int main()
{
int k;
int y,x;
while(scanf("%d", &k) !=EOF)
{
int count=0;
for(y=k+1; y<= 2*k; y++)
{
x=(k*y)/(y-k);
if(x*(y-k) == k*y && x>=y)
count++;
}
printf("%d\n",count);
for(y=k+1; y<= 2*k; y++)
{
x=(k*y)/(y-k);
if(x*(y-k) == k*y && x>=y)
printf("1/%d=1/%d + 1/%d\n",k,x,y);
}
}
return 0;
}