算法
分解自然数之和可重复,乘积最大
#include<bits/stdc++.h> using namespace std; //根据数学知识,分成若干个2和3 int maxn=0; //最大乘积 void find(int num,int cur) { if(cur>maxn){ maxn=cur; } // cout<<cur<<endl; if(num==0||num==1) return; if(num>=3){ find(num-2,cur*2); find(num-3,cur*3); } if(num==2){ find(num-2,cur*2); } } int main() { int num; // ifstream in; // in.open("input.txt"); // in>>num; // in.close(); cin>>num; find(num,1); // ofstream out; // out.open("output.txt"); // out<<maxn; // out.close(); cout<<maxn; return 0; }
分解不同自然数,乘积最大
#include<bits/stdc++.h> using namespace std; int maxn=1; //最大乘积 int main() { int num,i,j,cur=0,n[10000]; cin>>num; if(num<=4){ cout<<num; } else{ for(i=2,j=num;;i++,cur++){ j-=i; n[cur]=i; if(j-(i+1)<0){ break; } } int k=cur; for(int t=0;t<j;t++){ n[k]+=1; k--; // cout<<"n[k]"<<n[k]<<endl; } if(k==-2){ n[cur]++; } // cout<<"cur"<<cur<<endl; for(int t=0;t<=cur;t++){ // cout<<"n[t]"<<n[t]<<endl; maxn*=n[t]; } cout<<maxn; } return 0; }
删数问题
#include<bits/stdc++.h> using namespace std; //删掉最大的m个数字 int main() { int n,m,num[10000],cur=0; cin>>n>>m; for(int i=0;n;n/=10,i++){ num[i]=n%10; cur++; } // for(int i=0,j=cur-1;i<j;i++,j--){ //// cout<<num[i]<<" "<<num[j]<<endl; // int tmp=0; // tmp=num[i]; num[i]=num[j]; num[j]=tmp; // } reverse(num,num+cur); //num[i]表示 int t[10000]; for(int i=0;i<cur;i++){ t[i]=num[i]; } sort(t,t+cur); reverse(t,t+cur); for(int i=0;i<m;i++){ t[i]=10; } // for(int i=0;i<cur;i++){ // cout<<t[i]<<" "; // } for(int i=0;i<cur;i++){ for(int j=m;j<cur;j++){ if(num[i]==t[j]){ cout<<num[i]; t[j]=10; } } } return 0; }