【算法】刷题记录
计划:从15年校内选拔C-A逐渐开始刷
15年-C1
二项式的系数规律,我国数学家很早就发现了。
如【图1.png】,我国南宋数学家杨辉1261年所著的《详解九章算法》一书里就出现了。
其排列规律:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
如下的程序,用来建立N行的杨辉三角形。请填写划线部分缺少的代码。
注意:只填写划线部分的代码,不要填写任何多余的内容。
#define N 8
int main()
{
int a[N][N];
int i,j;
for(i=0; i<N; i++){
a[i][0] = 1;
a[i][i] = 1;
}
for(i=1; i<N; i++){
for(j=1; j<i; j++) ___________________________;
}
填空答案:
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0; i<N; i++){
for(j=0; j<=i; j++) printf("%-5d", a[i][j]);
printf("\n");
}
return 0;
}
15年-C2
1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢:
前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?
请填写这个整数。
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。
用程序跑一下便知。。。
C3
有如下的加法算式。其中每个汉字代表一个数字。
(如果存在对齐问题,可参见【图1.png】)
年
大年
过大年
能过大年
怎能过大年
我怎能过大年
+ 让我怎能过大年
------------------
能能能能能能能
请填写“让我怎能过大年” 所代表的整数。
所有数字连在一起,中间不要空格。例如:“3125697”。当然,这个不是正确的答案。
注意:只填写一个整数,不要填写任何多余的内容。
暴力? 一开始想着套7层循环 但实在是感觉复杂度太高了。。。
#include<stdio.h>
int main()
{
int sum;
int i;
int temp;
int a,b,c,d,e,f,g;//代表每一位上的数字
for(i=9992299;i>=1000000;i--)
{
a = i%10;//个位
b = i/10%10;//十位
c = i/100%10;//百位
d = i/1000%10; //千位
e = i/10000%10;//万位
f = i/100000%10;//十万位
g = i/1000000%10;//百万位
//printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a,b,c,d,e,f,g);
//break;
temp=d*1000000+d*100000+d*10000+d*1000+d*100+d*10+d*1;
//printf("%d\n",temp);
//break;
a=0+a*1;
b=a+b*10;
c=b+c*100;
d=c+d*1000;
e=d+e*10000;
f=e+f*100000;
g=f+g*1000000; //也可以直接g=i;
//printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a,b,c,d,e,f,g);
//break;
sum=a+b+c+d+e+f+g;
if(sum==temp)
{
printf("%d\n",i);
break;
}
}
return 0;
}
15年-C4
1193是个素数,对它循环移位后发现:
1931,9311,3119也都是素数,这样特征的数叫:循环素数。
你能找出具有这样特征的5位数的循环素数吗?
当然,这样的数字可能有很多,请写出其中最大的一个。
注意:答案是个5位数,不要填写任何多余的内容。
我的思路:99999 ~ 11111的n的降序循环 里面套一层五次循环移位的循环 顺便判断一个函数即判断是否是素数( 模2 ~ 根号n的循环 如果都模不等于0则返回它 )然后程序结束
注意有一个难点是 循环移位
int fun(int n)
{
int a = n%10;//取出最后一位 比如12345得出a=5
int b = n/10;//取出前面4位 b=1234
return a*10000+b; //经典的循环返回, 5*10000+1234=51234
}
15年-C5
把一个整数的每个数位都平方后求和,又得到一个整数,我们称这个整数为:位平方和。
对新得到的整数仍然可以继续这一运算过程。
比如,给定整数为4,则一系列的运算结果为:
16,37,58,89,…
本题的要求是,已知一个整数x,求第n步的运算结果。
数据格式要求:
输入,两个整数x n,中间以空格分开。表示求x的第n步位平方和。其中,x,n都大于0,且小于100000。
输出,一个整数,表示所求结果。
例如,
输入:
4 3
则程序应该输出:
58
再例如,
输入:
1314 10
则程序应该输出:
20
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
一开始被这个资源约定的限制吓到了,但实则就是一个很基础的题目
#include<stdio.h>
//传入一个数计算各位上数字的平方然后求他们位之和
int fun(int n)
{
int res