7.1.1简单枚举
除法
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79.
样例输入:
62
样例输出:
79546/01238=62
94736/01528=62
程序代码:
#include <iostream> using namespace std; int isright(int,int); int main() { int n,i; while(cin>>n){ for(i=1234;i*n<=98765;i++) if(i<=9876&&i*n>=12345&&isright(i,i*n)) cout<<i*n<<"/0"<<i<<"="<<n<<endl; if(i>=10234&&i*n>=56789&&isright(i,i*n)) cout<<i*n<<"/"<<i<<"="<<n<<endl; } return 0; } int isright(int x,int y){//判断xy是否是由不同的0~9九个数组成的 int a[10]={0}; for(int i=0;i<5;i++){ a[x%10]++; x=x/10; } for(int i=0;i<5;i++){ a[y%10]++; y=y/10; } for(int i=0;i<10;i++){ if(a[i]!=1) return 0; } return 1; }
7.1.2最大乘积
输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是正数,应输入-1(表示无解)。输入0结束输入。1<=n<=18,-10<=Si<=10。
样例输入:
3
2 4 -3
样例输出:
8
20
#include<iostream> #include<vector> using namespace std; int main(){ int n,m; vector<int> ivec; while(cin>>n){ if(n==0) break; for(int i=0;i<n;i++){ cin>>m; ivec.push_back(m); } long long max=-1; long long tem=1; for(vector<int>::iterator iter1=ivec.begin();iter1<ivec.end();iter1++) for(vector<int>::iterator iter2=ivec.begin();iter2<ivec.end();iter2++){ for(vector<int>::iterator iter=iter1;iter<=iter2;iter++){ tem=tem*(*iter); if(tem>max) max=tem; } tem=1; } cout<<max<<endl; ivec.clear(); } return 0; }
7.1.3分数拆分
输入正整数k,找到所有正整数x>=y,使得1/k=1/x + 1/y。
样例输入:
2
样例输出:
1/2=1/6 + 1/3
1/2=1/4 + 1/4
程序代码:
#include <iostream> using namespace std; int main() { int k; while(cin>>k){ for(int y=1;y<=2*k;y++){ float x=(float)k*y/(y-k); int tem=x; if(x==tem&&x>0) cout<<"1/"<<k<<"=1/"<<x<<"+1/"<<y<<endl; } } return 0; }
7.1.4双基回文数
如果一个正整数最小n至少在两个不同的进制位b1和b2下都是回文数(2<=b1,b2<=10),则称n是双基回文数(注意,回文数不能包含前导零)。输入正整数S<10^9,输出比S大的最小双基回文数。
样例输入:
1600000
样例输出:
1632995
#include <iostream> using namespace std; int isright(int); int main() { int n; cout<<"请输入一个正整数,将输出一个大于他的最小双基回文数\n"; while(cin>>n){ for(int i=n;;i++){ if(isright(i)){ cout<<i<<endl; break; } } } return 0; } int isright(int a){ int f=0;//统计各个进制是回文数的个数 for(int num=2;num<=10;num++){ char str[9]; itoa(a,str,num); int cont=strlen(str); for(int i=0;i<=cont/2;i++){ if(str[i]!=str[cont-i-1]) { f--; break; } } f++; } if(f>=2) return 1; else return 0; }