微生物增殖

    假设有两种微生物 X 和 Y

    X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

    一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。

    现在已知有新出生的 X=, Y=,求60分钟后Y的数目。

    如果X=,Y=  呢?

    本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

    题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!

    请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!
#include <iostream>
using namespace std; int main(void)
{
int x = , y = ; //
for(int i = ; i <= ; i++)
{
if(y <=)
{
y = ;
break;
} if(i % == ) //X三分钟分裂
{
x += x;
}
if(i % == ) //Y二分钟分裂
{
y += y;
}
//因为X出生半分钟后就要吃Y,尔后没1分钟要吃Y,
//所以永远都是奇数个半分钟的时候吃Y,
//又因为此时X不会增长所以直接减X数量即
if(i % == )
{
y -= x;
}
} cout << "X: " << x << "\tY: " << y << endl; return ;
}

古堡算式

    福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:

    ABCDE * ? = EDCBA

    他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”

    华生:“我猜也是!”

    于是,两人沉默了好久,还是没有算出合适的结果来。

    请你利用计算机的优势,找到破解的答案。

    把 ABCDE 所代表的数字写出来。

    答案写在“解答.txt”中,不要写在这里! 
#include <iostream>
using namespace std; int fun(int a, int b, int c, int d, int e)
{
return a* + b* + c* + d* + e;
} int main(void)
{
for(int a = ; a <= ; a++)
{
for(int b = ; b <= ; b++)
{
if(b == a) continue;
for(int c = ; c <= ; c++)
{
if(c == a || c == b) continue;
for(int d = ; d <= ; d++)
{
if(d == a || d == b || d == c) continue;
for(int e = ; e <= ; e++)
{
if(e == a || e == b || e == c || e == d) continue;
for(int f = ; f <= ; f++)
{
if(fun(a, b, c, d, e) * f == fun(e, d, c, b, a))
{
cout << fun(a, b, c, d, e) << endl;
}
}
}
}
}
}
} return ;
}

比酒量

    有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。

    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

    如果有多个可能的答案,请列出所有答案,每个答案占一行。

    格式是:人数,人数,...

    例如,有一种可能是:,,,,

    答案写在“解答.txt”中,不要写在这里!
#include <iostream>
using namespace std; int main(void)
{
for(int m = ; m >= ; m--)
{
for(int a = m - ; a >= ; a--) //第一轮剩
{
for(int b = a - ; b >= ; b--) //第二轮剩
{
for(int c = b - ; c >=; c--) //第三轮剩
{
if(((1.0/m) + (1.0/a) + (1.0/b) + (1.0/c)) == )
{
cout << m << "," << a << "," << b << "," << c << "," << << endl;
}
}
}
}
} return ;
}

奇怪的比赛

    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

    每位选手都有一个起步的分数为10分。

    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如: 就是可能的情况。

    你的任务是算出所有可能情况。每个答案占一行。

    答案写在“解答.txt”中,不要写在这里!
#include <iostream>
using namespace std; void play(int n) //反向输出一个整数的前10个比特位
{
for(int i = ; i <= ; i++)
{
if( n & (<<(i-)) )
{
cout << "";
}
else
{
cout << "";
}
}
cout << endl;
} void fun(int t, int s, int ans) //递归求解
{
/*
if(s == 100) //分数到达100,输出并且停止递归
{
play(ans);
return;
}
*/
//题意一定要理解透彻,必须要在打完10道题的同时分数等于100分才输出结果
if(t == ) //10道题目答完
{
if(s == ) //分数等于100分
{
play(ans); //输出
}
return; //递归返回
}
fun(t + , s + s, ans | ( <<(t-) ));
fun(t + , s - t, ans); } int main(void)
{
fun(, , ); return ;
}

转方阵

    对一个方阵转置,就是把原来的行号变列号,原来的列号变行号

    例如,如下的方阵:

    转置后变为:

    但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:

    下面的代码实现的功能就是要把一个方阵顺时针旋转。

void rotate(int* x, int rank)
{
int* y = (int*)malloc(___________________); // 填空 for(int i=; i<rank * rank; i++)
{
y[_________________________] = x[i]; // 填空
} for(i=; i<rank*rank; i++)
{
x[i] = y[i];
} free(y);
} int main(int argc, char* argv[])
{
int x[][] = {{,,,},{,,,},{,,,},{,,,}};
int rank = ; rotate(&x[][], rank); for(int i=; i<rank; i++)
{
for(int j=; j<rank; j++)
{
printf("%4d", x[i][j]);
}
printf("\n");
} return ;
} 请分析代码逻辑,并推测划线处的代码。 答案写在 “解答.txt” 文件中 注意:只写划线处应该填的内容,划线前后的内容不要抄写。
#include <cstdio>
#include <cstdlib> void rotate(int* x, int rank)
{
int* y = (int*)malloc(rank * rank * sizeof(int)); // МоїХ for(int i=; i<rank * rank; i++)
{
y[(i % rank * rank + ) - (i / rank)] = x[i]; // МоїХ
} for(int i=; i<rank*rank; i++)
{
x[i] = y[i];
} free(y);
} int main(int argc, char * argv[])
{
int x[][] = {{,,,},{,,,},{,,,},{,,,}};
int rank = ; rotate(&x[][], rank); for(int i=; i<rank; i++)
{
for(int j=; j<rank; j++)
{
printf("%4d", x[i][j]);
}
printf("\n");
} return ;
}

大数乘法

    对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。

    如图【.jpg】表示了分块乘法的原理。可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。

    以下代码示意了分块乘法的原理(乘数、被乘数都分为2段)。

void bigmul(int x, int y, int r[])
{
int base = ;
int x2 = x / base;
int x1 = x % base;
int y2 = y / base;
int y1 = y % base; int n1 = x1 * y1;
int n2 = x1 * y2;
int n3 = x2 * y1;
int n4 = x2 * y2; r[] = n1 % base;
r[] = n1 / base + n2 % base + n3 % base;
r[] = ____________________________________________; // 填空
r[] = n4 / base; r[] += _______________________; // 填空
r[] = r[] % base;
r[] += r[] / base;
r[] = r[] % base;
} int main(int argc, char* argv[])
{
int x[] = {,,,}; bigmul(, , x); printf("%d%d%d%d\n", x[],x[],x[],x[]); return ;
} 请分析代码逻辑,并推测划线处的代码。 答案写在 “解答.txt” 文件中 注意:只写划线处应该填的内容,划线前后的内容不要抄写。

#include <cstdio>

void bigmul(int x, int y, int r[])
{
int base = ;
int x2 = x / base;
int x1 = x % base;
int y2 = y / base;
int y1 = y % base; int n1 = x1 * y1;
int n2 = x1 * y2;
int n3 = x2 * y1;
int n4 = x2 * y2; //纵向累加
r[] = n1 % base;
r[] = n1 / base + n2 % base + n3 % base;
r[] = n2 / base + n3 / base + n4 % base; // 填空
r[] = n4 / base; //进位校正
r[] += r[] / base; // 填空
r[] = r[] % base;
r[] += r[] / base;
r[] = r[] % base;
} int main(int argc, char* argv[])
{
int x[] = {,,,}; bigmul(, , x); printf("%d%d%d%d\n", x[],x[],x[],x[]); return ;
}

放棋子

    今有  x  的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。下面的代码就实现了这个功能。

    初始数组中,“”表示放有棋子,“”表示空白。    

int N = ;

bool CheckStoneNum(int x[][])
{
for(int k=; k<; k++)
{
int NumRow = ;
int NumCol = ;
for(int i=; i<; i++)
{
if(x[k][i]) NumRow++;
if(x[i][k]) NumCol++;
}
if(_____________________) return false; // 填空
}
return true;
} int GetRowStoneNum(int x[][], int r)
{
int sum = ;
for(int i=; i<; i++) if(x[r][i]) sum++;
return sum;
} int GetColStoneNum(int x[][], int c)
{
int sum = ;
for(int i=; i<; i++) if(x[i][c]) sum++;
return sum;
} void show(int x[][])
{
for(int i=; i<; i++)
{
for(int j=; j<; j++) printf("%2d", x[i][j]);
printf("\n");
}
printf("\n");
} void f(int x[][], int r, int c); void GoNext(int x[][], int r, int c)
{
if(c<)
_______________________; // 填空
else
f(x, r+, );
} void f(int x[][], int r, int c)
{
if(r==)
{
if(CheckStoneNum(x))
{
N++;
show(x);
}
return;
} if(______________) // 已经放有了棋子
{
GoNext(x,r,c);
return;
} int rr = GetRowStoneNum(x,r);
int cc = GetColStoneNum(x,c); if(cc>=) // 本列已满
GoNext(x,r,c);
else if(rr>=) // 本行已满
f(x, r+, );
else
{
x[r][c] = ;
GoNext(x,r,c);
x[r][c] = ; if(!(-rr >= -c || -cc >= -r)) // 本行或本列严重缺子,则本格不能空着!
GoNext(x,r,c);
}
} int main(int argc, char* argv[])
{
int x[][] = {
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; f(x, , ); printf("%d\n", N); return ;
} 请分析代码逻辑,并推测划线处的代码。 答案写在 “解答.txt” 文件中 注意:只写划线处应该填的内容,划线前后的内容不要抄写。

#include <cstdio>

int N = ;

bool CheckStoneNum(int x[][])
{
for(int k=; k<; k++)
{
int NumRow = ;
int NumCol = ;
for(int i=; i<; i++)
{
if(x[k][i]) NumRow++;
if(x[i][k]) NumCol++;
}
if(NumRow != || NumCol != ) return false; // 填空
}
return true;
} int GetRowStoneNum(int x[][], int r)
{
int sum = ;
for(int i=; i<; i++) if(x[r][i]) sum++;
return sum;
} int GetColStoneNum(int x[][], int c)
{
int sum = ;
for(int i=; i<; i++) if(x[i][c]) sum++;
return sum;
} void show(int x[][])
{
for(int i=; i<; i++)
{
for(int j=; j<; j++) printf("%2d", x[i][j]);
printf("\n");
}
printf("\n");
} void f(int x[][], int r, int c); void GoNext(int x[][], int r, int c)
{
if(c<)
f(x, r, c+); // 填空
else
f(x, r+, );
} void f(int x[][], int r, int c)
{
if(r==)
{
if(CheckStoneNum(x))
{
N++;
show(x);
}
return;
} if(x[r][c] == ) // 已经放有了棋子
{
GoNext(x,r,c);
return;
} int rr = GetRowStoneNum(x,r);
int cc = GetColStoneNum(x,c); if(cc>=) // 本列已满
GoNext(x,r,c);
else if(rr>=) // 本行已满
f(x, r+, );
else
{
x[r][c] = ;
GoNext(x,r,c);
x[r][c] = ; if(!(-rr >= -c || -cc >= -r)) // 本行或本列严重缺子,则本格不能空着!
GoNext(x,r,c);
}
} int main(int argc, char* argv[])
{
int x[][] = {
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; f(x, , ); printf("%d\n", N); return ;
}

密码发生器

    在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了...

    这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。

    变换的过程如下:

    第一步. 把字符串6个一组折叠起来,比如wangximing则变为:
wangxi
ming 第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出: 第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: => ++= => += 上面的数字缩位后变为:, 这就是程序最终的输出结果! 要求程序从标准输入接收数据,在标准输出上输出结果。 输入格式为:第一行是一个整数n(<),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。
输出格式为:n行变换后的6位密码。 例如,输入: zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi 则输出: 注意: 请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分! 在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。 请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。 相关的工程文件不要拷入。 源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。 允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
#include <iostream>
#include <string>
using namespace std; int fun(int n)
{
int s = ;
while(n > )
{
s += n % ;
n /= ;
}
if(s / > )
{
return fun(s);
}
return s;
} int main(void)
{
int t;
cin >> t;
while(t--)
{
string str;
cin >> str; string * p_str = new string[str.size() / + ]; //根据输入字符串的长度创建string对象 for(int i = ; i < str.size() / + ; i++) //切割字符串
{
p_str[i] = str.substr(i * , );
//cout << p_str[i] << endl;;
} int ascii[] = {};
for(int i = ; i < str.size() / + ; i++)
{
for(int j = ; j < p_str[i].size(); j++)
{
ascii[j] += (int)(p_str[i])[j]; //纵向累加ascii码
//cout << (int)(p_str[i])[j] << endl;
}
}
for(int i = ; i < ; i++)
{
cout << fun(ascii[i]); //缩位处理
}
cout << endl; delete [] p_str;
} return ;
}

夺冠概率

    足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。

    假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:

    甲  乙  丙  丁
甲 - 0.1 0.3 0.5
乙 0.9 - 0.7 0.4
丙 0.7 0.3 - 0.2
丁 0.5 0.6 0.8 - 数据含义:甲对乙的取胜概率为0.,丙对乙的胜率为0.,... 现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。(参见【.jpg】) 请你进行10万次模拟,计算出甲队夺冠的概率。 注意: 请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分! 在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。 请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。 相关的工程文件不要拷入。 源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。 允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std; int rand_team(int n1, int n2 = -, int n3 = -) //返回0~3,并且不等于n1,n2,n3
{
int a = rand() % ;
if(a == n1 || a == n2 || a == n3)
{
return rand_team(n1, n2, n3);
}
return a;
} bool is_win(double n) //胜率n为时运用随机数判断胜负
{
double a = rand() % / 10.0; //0 ~ 0.9 if(a < n)
{
return true;
}
return false;
} int main(void)
{
srand((unsigned)time(NULL)); double a[][] = {{, 0.1, 0.3, 0.5},
{0.9, , 0.7, 0.4},
{0.7, 0.3, , 0.2},
{0.5, 0.6, 0.8, }};
double s = ; for(int i = ; i < ; i++)
{
int x = rand_team();
if(is_win(a[][x])) //甲对x胜利
{
int y = rand_team(, x);
int z = rand_team(, x, y);
if(is_win(a[y][z])) //y对z胜利
{
if(is_win(a[][y])) //甲决战胜利
{
s++;
}
}
else //y对z败北
{
if(is_win(a[][z])) //甲决战胜利
{
s++;
}
}
}
}
cout << s / 100000.0; return ;
}

取球游戏

    今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

    我们约定:

    每个人从盒子中取出的球的数目必须是:,,7或者8个。

    轮到某一方取球时不能弃权!

    A先取球,然后双方交替取球,直到取完。

    被迫拿到最后一个球的一方为负方(输方)

    请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?

    程序运行时,从标准输入获得数据,其格式如下:

    先是一个整数n(n<),表示接下来有n个整数。然后是n个整数,每个占一行(整数<),表示初始球数。

    程序则输出n行,表示A的输赢情况(输为0,赢为1)。

    例如,用户输入:


2 则程序应该输出: 注意: 请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分! 在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。 请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。 相关的工程文件不要拷入。 源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。 允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
#include <iostream>
using namespace std; const int N = ;
int a[N] = {};
// 1 3 7 8
void init(void)
{
// P 1 N 0
a[] = ; a[] = ; a[] = ; a[] = ;
a[] = ; a[] = ; a[] = ; a[] = ; for(int i = ; i < N; i++)
{
if(!a[i-] || !a[i-] || !a[i-] || !a[i-])
{
a[i] = ; //±Ø°Üµã
}
}
} int main(void)
{
init();
int t, n;
cin >> t;
while(t--)
{
cin >> n;
cout << a[n] << endl;
} return ;
}

最新文章

  1. Metro下读取txt文件
  2. Promise学习
  3. 将十六进制的字符串转化为UIImage
  4. Bootstrap的学习
  5. spring.net (2)环境搭建 对(1)例子的解释和扩充
  6. 纯代码自定义不等高cell
  7. andriod一次退出所有的Activity
  8. 字符串与byte数组转换
  9. oc精简笔记
  10. HDOJ 1875
  11. android studio首次运行出错
  12. 重载PostNcDestroy()函数做一些清理工作
  13. 使用Win32 API 查找文件
  14. Java并发编程小记
  15. android测试之——Instrumentation(一)
  16. Android组件化、模块化、插件化
  17. springboot项目怎么部署到外部tomcat
  18. 数据分析库之matplotlib
  19. Keil MDK忽略警告:文件末尾空白行警告
  20. angular组件之间的通讯

热门文章

  1. 传统的log4j实战
  2. 在ec2上创建root用户,并使用root 通过Xshell远程登录aws云服务器
  3. C#中的Dictionary字典类介绍
  4. 非常不错的ASP操作数据库类,支持多数据库MSSQL,ACCESS,ORACLE,MYSQL等
  5. IOS应用程序生命周期&amp;启动周期函数
  6. 如何制作css3的3d动画——以骰子旋转为例,详解css3动画属性
  7. java中的继承要点
  8. 图的遍历(bfs 和dfs)
  9. javascript——处理(获取)浏览器版本、操作系统
  10. javascript常用内置对象总结(重要)