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

来源:互联网 发布:千牛mac下载 编辑:程序博客网 时间:2024/06/07 00:40

十一Main函数必须返回int类型(正式比赛)

不要在for语句中定义类型

__int64不支持,可以用long long代替

使用了汉语的标点符号

itoa不是ansi函数

   能将整数转换为字符串而且与ANSI标准兼容的方法是使用sprintf()函数

        int num = 100;
    char str[25];
    sprintf(str, " %d" , num);

另外,拷贝程序容易产生错误

十二、n1到某个很大的数(如:100000000)之间,此类题目

㈠要么要找规律(如:hdu1005

㈡要么是大数问题

十三、hdu1133题的公式:(C(m+n, n)-C(m+n, m+1))*m!*n! 化简即(m+n)!*(m-n+1)/(m+1)

m个人拿50n个人拿100 所以如果 n>m,那么排序方法数为 0 这一点很容易想清楚

现在我们假设 50的人用 ‘0’表示, 100的人用 1 表示。

如果有这么一个序列 0101101001001111..........
当第K个位置出现1的个数多余0的个数时就是一个不合法序列了
假设n=4 n=3的一个序列是:0110100 显然,它不合法, 现在我们把它稍微变化一下:
把第二个1(这个1前面的都是合法的)后面的所有位0变成11变成0
就得到 0111011 这个序列1的数量多于0的数量, 显然不合法, 但现在的关键不是看这个序列是不是合法的
关键是:它和我们的不合法序列 0110100 成一一对应的关系
也就是说任意一个不合法序列(m0n1) 都可以由另外一个序列(n-10m+11)得到
另外我们知道,一个序列要么是合法的,要么是不合法的
所以,合法序列数量 = 序列总数量 - 不合法序列的总量
序列总数可以这样计算m+n 个位置中, 选择 n 个位置出来填上 1 所以是 C(m+n, n)
不合法序列的数量就是: m+n 个位置中, 选择 m+1 个位置出来填上 1 所以是 C(m+n, m+1)
然后每个人都是不一样的,所以需要全排列 m! * n!
推广:
如果原来有p50元的话,那么不合法的序列的数量应该是:
任意一个不合法序列(m0n1) 都可以由另外一个序列(n-10m+1+p1)得到,所以是
m+n
个位置中, 选择 m+1+p 个位置出来填上 1 所以是 C(m+n, m+1+p)
接下来的化简就不推了.(注意,程序用到了大数乘法).

十四、什么叫暴力算法?当前对于各种加密算法.除了有针对性的破解算法,最基本的思想就是穷举密钥进行匹配,通常称为暴力破解算法。由于暴力破解算法包含密钥个数较多,遍历的时间超过实际可接受的范围。如果计算速度提高到足够快。这种遍历的算法因结构设计简便而具有实际应用的前景。 
十五、编程常见错误:
Runtime Error (RE) : 运行时错误,这个一般是程序在运行期间执行了非法的操作造成的。以下列出常见的错误类型: 
ACCESS_VIOLATION 您的程序想从一些非法的地址空间读取或向其中写入内容。一般例如指针、数组下标越界都会造成这个错误的。 
ARRAY_BOUNDS_EXCEEDED 您的程序试图访问一个超出硬件支持范围的数组单元。 
INTEGER_DIVIDE_BY_ZERO 在进行整数除法的时候出现了除数为零的异常。 
STACK_OVERFLOW 栈溢出。一般是由于无限递归或者在函数里使用了太大的数组变量的原因
十六、
#include<stdio.h>
#include<math.h>
main()
{
               float benjin,profit,goal;
               int year;
               while((scanf("%f%f%f",&benjin,&profit,&goal))!=EOF){
                               year=log(goal/benjin)/log(1+profit/100.0);
                               printf("%d/n",int(year+1)[北方民族大学1] );
               }
}
#include<stdio.h>
main()
{
               int year;
               double benjin,rate,goal;
               while((scanf("%lf%lf%lf",&benjin,&rate,&goal))!=EOF){
                               year=0;
                               while(1){
                                              benjin+=benjin*rate/100.0;
                                              year++;
                                              if(benjin>=goal){ printf("%d/n",year);break;}
                               }
               }
}

[北方民族大学2] 错误分析:一、此程序思路正确,即本金*(1+年利率)n次方=n年的本息和

          二、误区:公式中的本息和是量化的,即只能去某些特定的值。而本题中给出的本息和是连续的,也就是说,year=log(goal/benjin)/log(1+profit/100.0);右边是浮点型的,左边是整型的。可能产生一个单位的误差。

如: int year;

                                         float sum=7.6;

                                         year=sum;

                                         printf("%d/n",year);结果是7.

         三、改动后,如下:

#include<stdio.h>

#include<math.h>

main()

{

       float benjin,profit,goal,k;

       int year;

       while((scanf("%f%f%f",&benjin,&profit,&goal))!=EOF){

              k=log(goal/benjin)/log(1+profit/100.0);

              year=(int)(k);

              if(year==k)

                  printf("%d/n",year);

              else

                     printf("%d/n",year+1);

       }

}

[北方民族大学3] 十七、Erase 语句 重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。语法Erase arraylist所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。说明Erase 根据是固定大小(常规的)数组还是动态数组,来采取完全不同的行为。Erase 无需为固定大小的数组恢复内存。Erase 按下表来设置固定数组的元素:数组类型Erase 对固定数组元素的影响固定数值数组将每个元素设为 0。固定字符串数组(长度可变)将每个元素设为零长度字符串 ("")。固定字符串数组(长度固定)将每个元素设为 0。固定 Variant 数组将每个元素设为 Empty。用户定义类型的数组将每个元素作为单独的变量来设置。对象数组将每个元素设为特定值 NothingErase 释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。(参见<ACM程序设计>

十八、error C2064: term does not evaluate to a function的意思是:编译器不能执行这个函数。可能你的函数写的不够恰当,编译器不能执行 你再想一下,这个函数到底要实现什么功能。补充:2064是该错误的固定编号。

十九、所有的三位数素数

101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257
263 269 271 277 281 283 293 307 311 313
317 331 337 347 349 353 359 367 373 379
383 389 397 401 409 419 421 431 433 439
443 449 457 461 463 467 479 487 491 499
503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631
641 643 647 653 659 661 673 677 683 691
701 709 719 727 733 739 743 751 757 761
769 773 787 797 809 811 821 823 827 829
839 853 857 859 863 877 881 883 887 907
911 919 929 937 941 947 953 967 971 977
983 991 997

二十、#include<stdio.h>

main()

{

       char ch;

       int i=1,sum=0;

       while(ch=getchar()){

              if(ch=='#') break;//读完全部输入

              if(ch!='/n'){

                     if(ch!=' ')

                            sum+=i*(ch-64);

            i++;

              }

              if(ch=='/n'){//当一行输入结束时,重新将isum初始化

                     printf("%d/n",sum);

                  i=1;sum=0;[北方民族大学4] 

              }//不可不要

       }

}

 


 [北方民族大学1]c(9) : error C2059: 语法错误 : “类型”2009-8-8为什么呢???对应HDOJ2398
去掉它后,就报“wrong answer

 [北方民族大学2]这个是AC了的

 [北方民族大学3]AC2009-8-8

 [北方民族大学4]这一部分当放在if语句里面,为什么呢???

本题来自HDOJ2734,<ACM程序设计>page106

原创粉丝点击