除法;输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1001;
int re[20];
void test(int num)
{
int len=0;
while(len<5)
{
re[num%10]++;
num/=10;
len++;
}
}
int main()
{
int n;
while(cin>>n)
{
int sum1,sum2;
for(sum1=1234;sum1<=98765;sum1++)
{
if(sum1%n==0)
{
memset(re,0,sizeof(re));
sum2=sum1/n;
test(sum1);
test(sum2);
int i;
for(i=0;i<10;i++)
if(re[i]!=1)
break;
if(i==10)
printf("%05d/%05d=%d\n",sum1,sum2,n);
}
}
}
return 0;
}
最大乘积:输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出-1.
1<=n<=18,-10<=Si<=10.
注意要用LL,做题之前必做三件事,分析时间复杂度,分析数组大小,分析数据大小。
这题即可以枚举起点和终点,也可以枚举个数。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<iostream>
#define LL long long
using namespace std;
int main()
{
LL a[20];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
LL sum=-1;
LL temp=1;
/* for(int i=1;i<=n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=j;k-j<i;k++)
{
temp*=a[k];
}
sum=max(sum,temp);
temp=1;
}
}*/
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
for(int k=i;k<=j;k++)
temp*=a[k];
sum=max(sum,temp);
temp=1;
}
}
if(sum<=0)
sum=-1;
cout<<sum<<endl;
}
}
输入正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y。
这题我是想了一会想到的y的范围,而没有想到把等式转化后带入不等式求出范围,这高中最基本的
思路竟然忘记了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
const int N=1001;
int main()
{
int k;
while(cin>>k)
{
int sum=0;
for(int y=k+1;y<=2*k;y++)
if(k*y%(y-k)==0)
sum++;
cout<<sum<<endl;
for(int y=k+1;y<=2*k;y++)
if(k*y%(y-k)==0)
printf("1/%d = 1/%d + 1/%d\n",k,k*y/(y-k),y);
}
return 0;
}
双基回文数:如果一个正整数n至少在俩个不同的进位制b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意,回文数不能包含前导零)。
输入正整数S<1e6,输出比S大的最小双基回文数。双基回文数比较密集,直接暴力枚举就行。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
const int N=1001;
int main()
{
int n;
while(cin>>n)
{
while(1)
{
n++;
int sum=0;
for(int i=2;i<=10;i++)
{
int flag=1;
int a[100];
int len=0;
int tem=n;
while(tem!=0)
{
a[len]=tem%i;
tem/=i;
len++;
}
for(int j=0;j<len/2;j++)
{
if(a[j]!=a[len-1-j])
{
flag=0;
break;
}
}
if(flag)
sum++;
if(sum==2)
break;
}
if(sum==2)
break;
}
cout<<n<<endl;
}
return 0;
}