二十六、1021解题报告:
如果两个数的和能被3整除,这两个数有什么特点?
各个数位之和可以被三整除
本题巧妙之处:从前一部分数中找到规律,即n整除8余6或余2,或者整除4余2,则f(n)能被3整除。
整型和短整型的区别是什么?
这两个都是用于存储整数.短整型的二进制位长是16,长整型的是32位.就是说长整型可以表示位数更多的整数.短整型所能表示的整数的值域为-32768~32767,长整型则为-2147483648~2147483647.例如,如果有个数为32780,那么它只能用长整型表示,而不能用短整型表示.
长整型和短整型的区别是什么?
两者所分配的内存的大小不同,因此有着不同的取值范围。short int的长度是2字节,所以它所能表达的范围在2的15次方减1到负的2的15次方。如果一个整数超过2的15次方,也就是32768就会溢出而变成复数。int的长度是4字节,所以当值超过2的31次方减1,也就是21亿5千万的时候才会溢出,能表达的范围就比short要宽。long int的长度是8字节,所以它可以表达至2的63次方减1,也就是9.22乘以10的18次方。当然,前提是你不是用Windows系统,在Windows下长整型和整型没有区别,都是4字节,在其他平台,如Linux或Mac下才是8字节,这点和Java不同。
二十七、算法的时间复杂度如何计算?
一个算法花费的时间与算法中语句的执行次数成正比例,时间复杂度一般用O(f(x))表示.
f(x)在简单程序中就是看有几个for循环,然后看看再它的判断语句,就是看看它执行了几次,f(x)=“执行的次数”。
像题中的(1)有一个for循环执行次数为n次,所以f(x)=n,时间复杂度就为O(n)
(2)有两个for循环执行次数为n*n,即n的平方,所以f(x)=n的平方,时间复杂度就是O(n的平方)。
(3)是递归,它也执行了n次所以它的时间复杂度就是O(n).
不过要注意时间复杂度的f(x)在有限次时就用具体数值表示,无限次时就用n,n的平方,log以2为底n的对数,其实很简单就是看n的最高次方,看n的最高次方等于几,f(x)就等于几。
二十八、//大整数乘法算法
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define Max 100 //这个数位数可以根据需要调整!
char res[Max];
void Init_char(char *res)
{
int i;
for(i=0;i<Max;i++)
res[i]='0';
}
void Init_int(int *a)
{
int i;
for(i=0;i<Max;i++)
a[i]=0 ;
}
/***********************************************************
* Function : 大整数相乘
* description : 两个大整数相乘,因为数组的存放方式和我们的乘法
是互逆的,所以需要从数组的最后一位往前面乘,并把每次
乘得到的结果先存放在一个数组中,乘完之后直接从这个
数组读取数据.
* input : res 既是一个乘数,也是用于存放相乘结果,为了可以让不同位数的
的大整数相乘,把res数组设很大,并在前面添加'0'.
mulNum 只是一个乘数而已
* output : 在相乘之后,把乘积输出.
* backworth : No backWorth!
**********************************************************/
void Long_Multy(char *res,char *mulNum)
{
int temp[Max]; // 用来存放中间结果,用整型数据结构,方便运算!!!
int i,j,len;
Init_int(temp); // 将数组元素都初始化为0
len=(int)strlen(mulNum);
int t=0;
for(i=len-1;i>=0;i--,t++){ // mulNum 对应的元素
for(j=Max-1;j>=0;j--){ // res 对应的元素
temp[j-t]+=(res[j]-'0') * (mulNum[i]-'0'); // 乘的过程存储!
}
}
int carry=0 ; // 整型结果转化为字符型结果.
for(i=Max-1;i>=0;i--){
res[i]=(temp[i]+carry)%10+'0';
carry=(temp[i]+carry)/10;
}
//--------------------输出乘积!
printf("相乘的结果为:/n");
for(i=0;i<Max;i++)
if(res[i]!='0')
break;
for(i;i<Max;i++)
putchar(res[i]);
printf("/n");
return;
}
void input(char *a,char *b) // 输入需要一些转换,所以单独写成一个函数!
{
int len,i;
scanf("%s %s",a,b);
Init_char(res);
len=strlen(a);
for(i=len-1;i>=0;i--) //往res数组存放乘数a.
res[Max+i-len] = a[i];
}
main()
{
char a[50],b[50];
input(a,b);
Long_Multy(res,b);
}
二十九、#include <stdio.h>
main()
{
unsigned long int[北方民族大学1] a,b;
scanf("%lu%lu[北方民族大学2] ",&a,&b);
printf("%lu/n", a*b[北方民族大学3] );
}
参见《C语言程序设计》课本第95页(表6.2)
三十、算法 动态规划 数字三角形问题
2006-07-30 20:33
关键字:数字三角形 最长 路经 算法分析与设计 清华大学出版社 王晓东 第 3 章
[问题说明]:有形如下图的数字三角形:
2
4 7
5 2 1
6 9 3 1
要求求出从顶点到底边的最长路经,路径的长度是路径所经过的数字之和。路径只能向左下或右下两个方向延伸。如:2,4,2,9 是一个路径。
[分析]:
· 采用动态规划的方法,从上到下一层一层的统计每层每一个节点为路径终点的最长路径。
· 对于边缘左节点,以其为终点的路径的倒数第二个节点只能是上一行的边缘左节点,如第3行的节点5,它只能来源于第2行的节点4.
· 对于边缘右节点,以其为终点的路径的倒数第二个节点只能是上一行的边缘右节点,如第4行的节点1,它只能来源于第3行的节点1.
· 对于一般中间节点,它可能来源于其上一行的左上和右上方的两个节点。要求以此节点为终点的最长路径,要计算来源于这两个节点的路径的权值,选择最大的一条.
[算法]:按照上述分析的思路,用权值数组记录每个节点计算出的权值,权值就是当前计算出的某个节点为终点的路径长度。其中,三角形的顶点的权值就是节点自己的值。其余节点的权值是自己的值加上其上一行的来源节点的权值。