建设职业注册中心网站,photoshop属于什么软件,淘宝网店托管,wordpress 标题字号递归算法 1206#xff1a;放苹果1207#xff1a;求最大公约数问题1208#xff1a;2的幂次方表示1209#xff1a;分数求和1210#xff1a;因子分解1211#xff1a;判断元素是否存在 1206#xff1a;放苹果 这道题还是有些难度的#xff0c;我们要考虑几种放苹果的情况。… 递归算法 1206放苹果1207求最大公约数问题12082的幂次方表示1209分数求和1210因子分解1211判断元素是否存在 1206放苹果 这道题还是有些难度的我们要考虑几种放苹果的情况。我默默把m代表苹果n代表盘子。
先把输入搞定这个还是简简单单的。
int main(){//多苹果少盘子 // 例如f(4)(3) f(4-3)(3) f(4)(2); // f(4)(2) f(4-2)(2)f(4)(1);//测试数据次数 cint;for(int i1;it;i){int a,b;cinab; //输入每组数据 coutapple(a,b)endl; }return 0;
}用apple函数求放苹果的次数。我们知道 多个苹果,0盘子; 多个苹果,1盘子; 0个苹果,多盘子;1个苹果,多盘子; 都只有一种方法哈。
if(m0||m1||n0||n1) return f[m][n]1;第二种放苹果情况就是 少苹果 多盘子应该怎么放 注意 题目讲道 1 2 第一个盘子放1个苹果第二个盘子放2个苹果 2 1 第一个盘子放2个苹果第二个盘子放1个苹果 是一样的只算一种方法。 那上面图片橙色线的放法 1 1 1 1 0 紫色线的放法 0 1 1 1 1 都算同一种 4苹果5盘子其实就相当于 4苹果4盘子的方法。代码表示则
return f[m][n] apple(m,m);最后一种情况多苹果少盘子。 那这样会出现每个盘子都至少有苹果 另外情况就是 有盘子没放苹果 把这两种可能加起来就是多苹果少盘子的放法。 会出现每个盘子都至少有苹果 那上面图片是不是有一个苹果没放对吧 1个苹果3个盘子的放法是
apple(4-3,3); //m苹果n盘子
apple(m-n,n);上图是有盘子没放苹果的情况则变成4个苹果2个盘子的放法是
apple(4,3-1); //m苹果n盘子
apple(m,n-1);完整代码
#includebits/stdc.h
using namespace std;
int m,n,t; //m代表苹果n代表盘子
int f[15][15]{0};
int apple(int m,int n){
// 多个苹果,0盘子; 多个苹果,1盘子;
// 0个苹果,多盘子;1个苹果,多盘子; 都只有一种 if(m0||m1||n0||n1) return f[m][n]1;if(mn){ //多苹果少盘子 return f[m][n] apple(m-n,n) apple(m,n-1);}else{return f[m][n] apple(m,m);}}
int main(){//多苹果少盘子 // 例如f(4)(3) f(4-3)(3) f(4)(2); // f(4)(2) f(4-2)(2)f(4)(1);//测试数据次数 cint;for(int i1;it;i){int a,b;cinab; //输入每组数据 coutapple(a,b)endl; }return 0;
}
1207求最大公约数问题 最大公约数用辗转相除法做即可。
#includeiostream
using namespace std;
int gcd(int a,int b){if(b0) return a;return gcd(b,a%b);
}int a,b;
int main(){cinab;coutgcd(a,b);return 0;
}12082的幂次方表示 输入一个值这个值从0次方开始拆分
int main(){int n;cinn;f(n,0); return 0;
}173 怎么得出2的几次方呢 值n用短除法不断➗2有余数1代表次方有。除一次2就次方k1直到n除到0结束。
void f(int n,int k){ //n是值k是几方数 if(n0) return ; //值0,结束 n / 2;f(n,k1); //不断除2,往下搜 根据题目要求分解要在余数为1的情况
2的0次方分解 2(0)2的1次方分解 22的2次方分解 2(2)2的2次方以上分解 以次方k的值作为n重新调用函数进行次方的再次分解。
if(yu1){ //有余数,就输出
// cout2(k);if(k0) cout2(0);else if(k1) cout2;else if(k2) cout2(2); else{ //超过2的次方重新模拟调用 cout2(;f(k,0);//对7再进行模拟cout); }} 题目输出要有号。注意当有余数和值不为0情况。
if(n!0 yu!0) cout; 完整代码
#includebits/stdc.h
using namespace std;
void f(int n,int k){ //k是次方数 if(n0) return ; //值0,结束 int yu n % 2; //求余数 n / 2;f(n,k1); //不断除2,往下搜
// 2进制数,哪个次方数是1、是0; 137 010001001; 12881if(n!0 yu!0) cout; if(yu1){ //有余数,就输出
// cout2(k);if(k0) cout2(0);else if(k1) cout2;else if(k2) cout2(2); else{ //超过2的次方重新模拟调用 cout2(;f(k,0);//对7再进行模拟cout); }}
}
int main(){int n;cinn;f(n,0); return 0;
}1209分数求和 由题目可知要模拟出分数相加的情况也就是分母相乘分子通分求和在最后进行化简。
要定义变量第一次输入值 表示第一个数的分子分母。
int main(){int a,b,n,fz,fm;char c;cinn;cinacb;fz a;fm b;接着从第二个值的分数到第n个分数逐个输入输入一个分数我们就进行通分操作。
for(int i2;in;i){cinacb;分子通分fz fz*b fm*a; //分子 分母相乘fm fm*b; //分母
对通分的结果进行最简化那我们要同时分子分母除以最大的共同因子也就是最大公约数。
int gcd(int a,int b){if(b0) return a;return gcd(b,a%b);
}int yue gcd(fz,fm);fz / yue; //约分 fm / yue; //约分 最后判断分母是1就直接输出分子。 if(fm1) coutfzendl; //分母是1,直接输出分子else coutfz/fmendl; 完整代码
#includebits/stdc.h
using namespace std;
int gcd(int a,int b){if(b0) return a;return gcd(b,a%b);
}
int main(){int a,b,n,fz,fm;char c;cinn;cinacb;fz a;fm b;for(int i2;in;i){cinacb;fz fz*b fm*a; //分子 fm fm*b; //分母int yue gcd(fz,fm);fz / yue; //约分 fm / yue; //约分 }if(fm1) coutfzendl; //分母是1,直接输出分子else coutfz/fmendl; return 0;
}
1210因子分解 对n 从2到n进行除法能被整除代表改因子可以分解。
int main(){int n,cnt0,f0;cinn;for(int i2;in;i){//判断整除}如果能被整除就统计这个因子 i 的次数 cnt1。接着再对n进行分解直到分解不了。
// 1.判断能被整除if(n%i0){cnt 0; //统计分解的次数while(n%i0){ //实现数字的分解 n n/i;cnt;}再这个因子的次数有无超过1有要输出 “^” 乘号 * 输出在两个数中间。 最后判断n分解到值1就结束循环。 if(f0) f1; //保证乘号不能第一次else cout*;couti;if(cnt1) cout^cnt;if(n1) return 0; 完整代码
#includebits/stdc.h
using namespace std;
int main(){int n,cnt0,f0;cinn;for(int i2;in;i){
// 1.判断能被整除if(n%i0){cnt 0; //统计分解的次数while(n%i0){ //实现数字的分解 n n/i;cnt;}if(f0) f1;else cout*;couti;if(cnt1) cout^cnt;if(n1) return 0; } } return 0;
}1211判断元素是否存在 1.题目输入需要用到c语言的输入方式。输入完判断是否满足条件是就输出YES否则NO。用函数去完成判断条件
int main(){
// cinkx;scanf(%d,%d,k,x);if(search(k)){coutYES;}else{coutNO;}return 0;
}x等于k也是满足函数条件意味x是M的元素因为k本身是M的元素
int x,k;
int search(int y){ //主函数k的值传到yif(yx){return true;} 当xk是 不会满足2k1和3k1 的条件。
if(yx){return false;}当xk是 调用下函数是否满足2k1和3k1 的条件。 if(xy){return search(2*y1) || search(3*y1);}完整代码
#includebits/stdc.h
using namespace std;
int x,k;
int search(int y){if(yx){return true;} if(yx){return false;}if(xy){return search(2*y1) || search(3*y1);}
}
int main(){
// cinkx;scanf(%d,%d,k,x);if(search(k)){coutYES;}else{coutNO;}return 0;
}