读书人

一道不编程一道编程 个人感觉不是很

发布时间: 2012-05-16 11:12:12 作者: rapoo

一道不编程一道编程 ,个人感觉不是很好做 。
题一 :池塘里有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;这样?
探讨

如果这是面试题,第一题,答 100*1.1^50 ,这样的答案的话,短期内只能做码农了

读书人网 >C语言

热点推荐