一道不编程一道编程 ,个人感觉不是很好做 。
题一 :池塘里有100条鱼 ,每年增加10% ,问50年后有多少条鱼 .<不编程 ,也是求方法的吧 !>
题二 :一副除去大小王的扑克牌 ,打乱之后一次抽出4张牌 ,用"加" "减" "乘" "除" ,求四张牌能不能得出21 ,要求用过的牌
和得不出21的牌都是只能用一次 ,放到一边去等于 ,抽出的4张牌每张牌都是只能用一次 ,"加" "减" "乘" "除"不限 .
不能整除的不能相除 ,不能小减大 .不知道我说清楚了没有 .<编程题>
[解决办法]
这还一段强悍的代码
- C/C++ code
#include <stdio.h>#include <string.h>#include <algorithm>#define OP(o) do { a[1].n = a[0].n o a[1].n; \ sprintf(a[1].s, "(%s"#o"%s)", a[0].s, strcpy(t.s, a[1].s)); \ if (dfs(n - 1, a + 1, r)) return 1; \ a[1] = temp; } while (0)struct data { double n; char s[90];}num[4], t;int dfs(int n, data a[], double r) { int i, j; if (n == 1) if (a[0].n - r > 1e-8 || a[0].n - r < -1e-8) return 0; else return 1; for (i = 0; i < n; ++i) { std::swap(a[i], a[0]); for (j = 1; j < n; ++j) { std::swap(a[j], a[1]); data temp = a[1]; OP(+); OP(-); OP(*); if (a[1].n > 1e-8 || a[1].n < -1e-8) OP(/); std::swap(a[j], a[1]); } std::swap(a[i], a[0]); } return 0;}int main() { for (int r = 24; ; ) { for (int i = 0; i < 4; ++i) { scanf("%s", num[i].s); sscanf(num[i].s, "%lf", &num[i].n); } if (dfs(4, num, r)) printf("%s = %d\n", num[3].s, r); else printf("No answer\n"); } return 0;}
[解决办法]
关于第一题50次方问题的算法,跟模幂算法类似:
double power(a,n){
/*求a的n次方*/
//先将n表示成二进制数bk,bk-1,bk-2,...,b0;此处用位操作。
int b;
int d=1;
int k;//k 为 n表示成二进制的位数.
k=(int)(log(n)/log(2))+1;
for(int i=k;i>=0;i--){
d=d*d;
b=(1<<k)&n;
if(b!=0) d=d*a;
}
return d;
}
以上是我写的一个求幂的代码,由于个人水平有限,算法效率不是很高,下面给出算法伪代码。
//////伪代码为////////
将n表示成二进制数bk,bk-1,bk-2,...,b0;
c=0; d=1; // 变量c用于统计算法中乘法的次数,可以省略。
for i=k downto 0 do {
c=2*c;
d=d*d;
if bi=1 then{
c=c+1;
d=d*a;
}
}
return d;
[解决办法]
那你会怎么答
s(i)=(int)(s(i-1)*1.1);
s(1)=100;这样?