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

来源:互联网 发布:python开发环境 编辑:程序博客网 时间:2024/06/05 12:15

ACM学习方式

 

n       练习->总结->练习->总结->……

n       http://acm.hdu.edu.cn

n       杭电ACM论坛

n       googlebaidu

 

一、航电ACM  no1096调试记录

1.#include<stdio.h>

main()

{

       int t,n,sum,a;

       scanf("%d",&t);

       while(t--){

              scanf("%d",&n);

              sum=0;[y1] 

              while(n--){

                     scanf("%d",&a);

                     sum+=a;

                

              }

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

Sample Input

3

4 1 2 3 4

5 1 2 3 4 5

3 1 2 3

 

 

Sample Output

10

 

15

 

6

#include<stdio.h>

main()

{

       int t,n,sum=0[y2] ,a;

       scanf("%d",&t);

       while(t--){

              scanf("%d",&n);

              while(n--){

                     scanf("%d",&a);

                     sum+=a;

                

              }

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

Sample Input

3

4 1 2 3 4

5 1 2 3 4 5

3 1 2 3

 

 

Sample Output

10

 

25

 

31

以上程序要说明的问题同课本《c语言程序设计》第68页下程序段类似。

printf("%d/n/n",sum);followed by a blank line.
printf("/n%d/n",sum);
每两个答案间空一行a blank line between outputs.

二.#include<stdio.h>

void main()

{

       int i,j;

       double item,sum;

       sum=0;

       for(i=0;i<=100;i++){

              item=1;

              for(j=1;j<=i;j++)

                     item*=j;

              sum+=item;

       }

       printf("1!+2!+3!+4!+5!……+100!=%e/n",sum);

}

合并循环,可否???当然不可以!

运行结果:

1!+2!+3!+4!+5!……+100!=9.426900e+157

请按任意键继续. . .

三.为何不以0未结束标志???No1006集训一(题目如下:)

#include<stdio.h>

int main(void)

{

       int sum,a,m;

    do{

           scanf("%d",&m);

        sum=0;

              while(m--){

                     scanf("%d",&a);

                  sum+=a;

            }

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

       }while(m[GP3] );

       return 0;

}

四.比较以下两个程序中“sum=0”的异同:

/*#include<stdio.h>

int main()

{

       int sum=0[y4] ,a,n,m;

       scanf("%d",&n);

       while(n--){

              scanf("%d",&m);

           while(m--){

                     scanf("%d",&a);

                  sum+=a;

              }

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

       }

       return 0;

}*/

 

#include<stdio.h>

main()

{

int a,b,n,sum;

scanf("%d",&n);

while(n--){

    sum=0[y5] ;

    scanf("%d",&a);

    while(a--){

        scanf("%d",&b);

        sum+=b;

    }

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

}

}

五.#include<stdio.h>

int main()

{

       int n,a,m,sum;

    while(1)[y6] {

          sum=0;

          scanf("%d",&n);

          while(n--){

                 scanf("%d",&[y7] a);

                 sum+=a;

          }

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

          }

       return 0;

}

#include<stdio.h>

main()

{

int b,n,sum;

while((scanf("%d",&n))!=EOF)[y8] 

{

    sum=0;

    while(n--){

        scanf("%d",&b);

        sum+=b;

    }

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

}

}

六.Problem Description

Your task is to calculate the sum of some integers.

 

 

Input

Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line.

 

 

Output

For each group of input integers you should output their sum in one line, and you must note that there is a blank line between outputs.

 

 

Sample Input

3

4 1 2 3 4

5 1 2 3 4 5

3 1 2 3

 

 

Sample Output

10

 

15

 

6

 

#include<stdio.h>

main()

{

int a,b,n,sum;

scanf("%d",&n);

while(n--){

    sum=0;

    scanf("%d",&a);

    while(a--){

        scanf("%d",&b);

        sum+=b;

    }

    if(n)

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

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

[微软用户9] }

}

六格式控制说明与参数:

double f(int money,int year,double rate);

main()

{

       int money,year;

       double sum,rate;

       scanf("%d%d%l[微软用户10] f",&money,&year,&rate);

       sum=f(money,year,rate);

       printf("sum=%.2f/n",sum);

}

double f(int money,int year,double rate)

{

       double result;

       result=money*pow((1+rate),year);

       return result;

}

七数组范围(长度)问题:

#include<stdio.h>

int main()

{

       int a[44[微软用户11] ],i,n,m;

       scanf("%d",&n);

       while(n--){

              a[2]=1;

              a[3]=2;

              scanf("%d",&m);

              for(i=2;i<=m;i++){

                     a[i+2]=a[i+1]+a[i];

              }

              printf("%d/n",a[m]);

       }

       return 0;

}

八经验之谈:

error C2601: 'f' : local function definitions are illegal

fatal error C1004: unexpected end of file found

的同时显示,可能表明while等语句右“}”没匹配。

2void f(int k){

       for(int a[北方民族大学12] =1;a<66;a++){

        if((18+a*k)%65==0){

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

            return;

        }

    }

    printf("no/n");

}

hdu1098(数学归纳)

又是一个以前不敢做的题(或者说找不到思路).
今天在网上看了一下别人的思路,证明该题果然还是利用数学归纳思想求解.

题意浅析:对给定非负整数k , 求最小非负整数a,使得对任意x,都有f(x)65整除.其中:
    f(x)=5*x^13+13*x^5+k*a*x
 
先找个思路吧,由于是最小非负整数,a显然应该从1开始取的,f(1)的值还是容易得到的.
要对任意x,都有65|f(x),即是说若 65|f(x) , 65|f(x+1). PS:找到数学归纳的感觉了.:
对给定k,若已知 65 | f(1),
65 | f(x),

    f(x+1)     = 13 * (x+1)^5 + 5 * (x+1)^13 + a*k*(x+1)
        = 13 * [C(0,5) * x^ 5 + ... + C(5,5)] + 5 * [ C(0,13) * x^13 + .. + C(13,13) ] + a*k*x + a*k
        = 13*x^5 + 13 + 5*x^13 + 5 + a*k*x + a*k
        = 18 + a*k    (mod 65)
   
由于65 | f(1) , 所以对任意k,只要a的取值使 65 | f(1),即可导出 65 | f(x) , 65 | (18 + a*k).
   
而从a=1递增,应用抽屉原则,a<66时必有一值使 65 | ( 18 + a*k) , 否则无解.   

代码就很简单了:(参见hud1098

十如何从一开始就避免错误?

有这样一句谚语——“防患于未然”,它的意思是避免问题的出现比出现问题后再想办法弥补要好得多。这在计算机编程中也是千真万确的!在编写程序时,一个经验丰富的程序员所花的时间和精力要比一个缺乏经验的程序员多得,但正是这种耐心和严谨的编程风格使经验丰富的程序员往往只需花很少的时间来调试程序,而且,如果此后程序要解决某个问题或做某种改动,他便能很快地修正错误并加入相应的代码。相反,对于一个粗制滥造的程序,即使它总的来说还算正确,那么改动它或者修正其中一个很快就暴露出来的错误,都会是一场恶梦。

 


第二次循环前赋初值

定义时赋初值

 [GP3]此处m==0就是结束标志

Sum此处赋值,本程序就通不过HODJ,但在vc++6.0中编译正确

能通过HDOJ

永远为真

Runtime Error
(ACCESS_VIOLATION)
 运行时错误(存取_违反)

EOF

 [微软用户9]不要可否???思考!

 [微软用户10]存在与否直接导致最终结果对与错2009-7-15

 [微软用户11]题目告诉m的范围1<=m<=40,当我定义a[40]提交后报错。此时能AC!——数组范围(长度)问题2009-7-16

 [北方民族大学12]这就表示该程序是c++写的,提交时应用c++,而不是c,否则系统会报语法错误(vc++6.0编译器不会报错)

原创粉丝点击