1、键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。输入数据均不需判错。输出应包括所去掉的数字的位置和组成的新的正整数(N不超过240位)
算法分析:将N存在字符串中,模拟数据运算。
算法设计:若高位高于地位则删除高位,由前往后去除S位。若遍历字符串后删除位数小于S则删去最末尾几位,直到满足删除S的条件,同时输出前去除首位的0。
代码:
#include<iostream> #include<string> using namespace std; void getmin(string &n,int &s,int k)//递归判断是否删去 { for(int i=k; i<n.size()-1; i++) { if (n[i]>n[i+1]) { n.erase(i,1); getmin(n,--s,i-1); } } } int main() { string n; int s; cin>>n>>s; getmin(n,s,0); while(s>0)//若删去位数小于S,删去末尾至满足条件 { n.erase(n.size()-1,1); s--; } n.erase(0,n.find_first_not_of('0'));//去除首位的0 if (n.empty())//若S与N的位数相等输出0 { n="0"; } cout<<n<<endl; }
Hide:
1.string.erase(pos,n);
删除从pos开始的n个字符,比如erase(0,1)
就是删除第一个字符;
2.string.find_first_not_of(char);
返回字符串第一个不是char的值的位置;
2、某单位给每个职工发工资(精确到元)。为了保证不要临时兑换零钱, 且取款的张数最少,取工资前要统计出所有职工的工资所需各种币值(100,50,20,10,5,2,1元共七种)的张数。请编程完成。
算法分析:建立员工工资类,各种币值设置为静态成员。
算法设计:分别为每个员工求出各种币值的张数再求和。
代码:
#include<iostream> using namespace std; class yg { public: yg(int a=0):gz(a){} void setgz(int a) { gz=a; fun(); } void fun() { m100+=gz/100;gz%=100; m50+=gz/50;gz%=50; m20+=gz/20;gz%=20; m10+=gz/10;gz%=10; m5+=gz/5;gz%=5; m2+=gz/2;gz%=2; m1+=gz; } static int m100,m50,m20,m10,m5,m2,m1; private: int gz; }; int yg::m100=0,yg::m50=0,yg::m20=0,yg::m10=0,yg::m5=0,yg::m2=0,yg::m1=0;//初始化 int main() { int n,g; cin>>n; //输入员工数 yg *p=new yg[n]; for(int i=0;i<n;i++) { cin>>g;//分别输入员工工资 p[i].setgz(g); } cout<<yg::m100<<" "<<yg::m50<<" "<<yg::m20<<" "<<yg::m10<<" "<<yg::m5<<" "<<yg::m2<<" "<<yg::m1<<endl; }
3、有形如下图所示的一个数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的数值和最大。
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
算法分析:二位数组储存数塔。
算法设计:由倒数第二层开始往上层更新节点为由这个点到底部的最大值,塔尖得数为答案。
代码:
#include<iostream> using namespace std; int a[5+2][5+2]; int main() { for(int i=0;i<5;i++) { for(int j=0;j<=i;j++) cin>>a[i][j]; } for(int i=3;i>=0;i--) { for(int j=0;j<=i;j++) { a[i][j]+=max(a[i+1][j],a[i+1][j+1]); } } cout<<a[0][0]<<endl; }
评论