ACM_编程与调试重点记录(四)

二十六、1021解题报告:

如果两个数的和能被3整除,这两个数有什么特点?

各个数位之和可以被三整除

本题巧妙之处:从前一部分数中找到规律,即n整除86或余2,或者整除42,则fn)能被3整除。

整型和短整型的区别是什么?

这两个都是用于存储整数.短整型的二进制位长是16,长整型的是32.就是说长整型可以表示位数更多的整数.短整型所能表示的整数的值域为-32768~32767,长整型则为-2147483648~2147483647.例如,如果有个数为32780,那么它只能用长整型表示,而不能用短整型表示.

长整型和短整型的区别是什么?

两者所分配的内存的大小不同,因此有着不同的取值范围。short int的长度是2字节,所以它所能表达的范围在215次方减1到负的215次方。如果一个整数超过215次方,也就是32768就会溢出而变成复数。int的长度是4字节,所以当值超过231次方减1,也就是21亿5千万的时候才会溢出,能表达的范围就比short要宽。long int的长度是8字节,所以它可以表达至263次方减1,也就是9.22乘以1018次方。当然,前提是你不是用Windows系统,在Windows下长整型和整型没有区别,都是4字节,在其他平台,如LinuxMac下才是8字节,这点和Java不同。

二十七、算法的时间复杂度如何计算?

一个算法花费的时间与算法中语句的执行次数成正比例,时间复杂度一般用Of(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)在有限次时就用具体数值表示,无限次时就用nn的平方,log2为底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.

·                    对于一般中间节点,它可能来源于其上一行的左上和右上方的两个节点。要求以此节点为终点的最长路径,要计算来源于这两个节点的路径的权值,选择最大的一条.

[算法]按照上述分析的思路,用权值数组记录每个节点计算出的权值,权值就是当前计算出的某个节点为终点的路径长度。其中,三角形的顶点的权值就是节点自己的值。其余节点的权值是自己的值加上其上一行的来源节点的权值。

 


 [北方民族大学1]此为长整型,表示整数范围0429496729542亿多)。若超出此范围,我们就得用大数算法2009-8-11

 [北方民族大学2]此外当注意,格式控制说明如此

 [北方民族大学3]最后的结果保存在长整型存储单元中,范围04294967295

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值