中奖计算
某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。
例如:小张写的数字是:12345678,而开奖号码是:42347856。则称小张中了3个号,因为其中最长的相同连续位是:“234”。如果小张写的是:87654321,则他只中了一个号。
下面的代码根据传入的参数,返回中了几个号。其中:a表示被评价的号码,b表示摇号产生的数字。请填写缺少的代码。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
int g(int a, int b)
{
char sa[]="00000000";
char sb[]="00000000";
int n = 0;
int i,j;
sprintf(sa,"%8d",a);
sprintf(sb,"%8d",b);
for(i=0; i<8; i++)
{
for(j=1; j<=8-i; j++)
{
char t = ________;
sa[i+j] = 0;
if(strstr(sb, sa+i))
{
if(j>n) _________;
}
sa[i+j] = t;
}
}
return n;
}
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int n = 0;
int g(int a, int b)
{
char sa[]="00000000";
char sb[]="00000000";
int i,j;
sprintf(sa,"%8d",a);
sprintf(sb,"%8d",b);
for(i=0; i<8; i++)
{
for(j=1; j<=8-i; j++)
{
char t = sa[i+j];
sa[i+j] = 0;
if(strstr(sb, sa+i))
{
if(j>n) n=j;
}
sa[i+j] = t;
}
}
return n;
}
int main()
{
int a=12345678;
int b=42347856;
g(a,b);
cout<<n;
return 0;
}
如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625
下面代码的目的是寻找出2千万以内的所有自守数。
注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。
请分析代码并填写缺失的部分。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
void zishou()
{
int n;
for(n=1; n<20 * 1000 * 1000; n++)
{
int n2 = n;
int m = 0;
for(;;)
{
if(n2==0)
{
printf("%d\n", n);
break;
}
int k = n2 % 10; // 从末尾开始,取出乘数的每位数字
m += k * n; // 累计乘积
if(k!=m%10) break;
m = m / 10; // 舍去累计乘积的末位
n2 = n2/10;
}
}
}
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
int n;
for(n=1; n<20 * 1000 * 1000; n++)
{
int n2 = n;
int m = 0;
for(;;)
{
if(n2==0)
{
printf("%d\n", n);
break;
}
int k = n2 % 10; // 从末尾开始,取出乘数的每位数字
m += k * n; // 累计乘积
if(k!=m%10) break;
m = m / 10; // 舍去累计乘积的末位
n2 = n2/10;
}
}
return 0;
}
没办法,一点一点的尝试,代入法
金字塔
下面代码的目标是输出一个大写字母组成的金字塔。
其中space表示金字塔底距离左边的空白长度,x表示金字塔底的中心字母。
比如:space=0, x=’C’,则输出:
A
ABA
ABCBA
再如:space=2,x=’E’, 则输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
请分析该段代码的逻辑,填写缺少的部分。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
void h(int space, char x)
{
int i;
if(x<'A' || x>'Z') return;
;
for(i=0; i<space; i++) printf(" ");
for(i=0; i<x-'A'; i++) printf("%c",'A'+i);
for(i=0; i<=x-'A'; i++) printf("%c",x-i);
printf("\n");
}
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
void h(int space, char x)
{
int i;
if(x<'A' || x>'Z') return;
h(space+1,x-1);
for(i=0; i<space; i++) printf(" ");
for(i=0; i<x-'A'; i++) printf("%c",'A'+i);
for(i=0; i<=x-'A'; i++) printf("%c",x-i);
printf("\n");
}
int main()
{
h(0,'C');
h(3,'E');
return 0;
}
递归,每次打印一行然后换行递归调用
组合数
从4个人中选2个人参加活动,一共有6种选法。
从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。
请仔细分析代码,填写缺少的部分(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
// n 个元素中任取 m 个元素,有多少种取法
int f(int n, int m)
{
if(m>n) return 0;
if(m==0) _______________;
return f(n-1,m-1) + _____________;
}
#include <iostream>
using namespace std;
int f(int n, int m)
{
if(m>n) return 0;
if(m==0) return 1;
return f(n-1,m-1) + f(n-1,m);
}
int main()
{
cout<<f(5,3);
return 0;
}
组合数的理解
Cn0=1
理解组合时候从n个球里面选m个球,有a这个球和没有a这个球两种情况叠加即可