zoukankan      html  css  js  c++  java
  • 杭电OJ 输入输出练习汇总

    • 主题

      Calculate a + b

    • 杭电OJ-1000

      • Input

        Each line will contain two integers A and B. Process to end of file.

      • Output

        For each case, output A + B in one line.

      • Mine

        #include <stdio.h>
        
        int main()
        {
            int a,b;
            while(~scanf("%d %d",&a,&b))   //多次输入a和b。
            {
                printf("%d
        ",a+b);
            }
        }
        
        /*** 
        while(~scanf("%d %d",&a,&b)) 多次输入a和b。
        这句话中的“~”符号可以理解为“重复”,代码含义是反复执行scanf(“%d %d”,&a,&b) 语句,直到语句接收不到有效结果。换一种说法就是while语句会在括号中的判断为真的情况执行语句,那么对于scanf函数而言,判断为真也就是接收到了有效数据。而~符号代表无限重复,直到scanf语句不能取到有效的值为止(while的括号中判断为假),循环跳出。
        ***/
        
      • Review

        题目: 接收两个整数并返回两个数的和。
        需要注意的是题目中说明了每行两个数据,但并没有说明多少行。

        换一种常用说法叫:“多组数据”,是常见的要求。但没有C语言算法书会写明接收多组数据的方式。

    • 杭电OJ-1001

      • Description

        calculate SUM(n) = 1 + 2 + 3 + ... + n.

      • Input

        The input will consist of a series of integers n, one integer per line.

      • Outpu

        For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.

      • Mine

        #include<stdio.h>
        
        int main()
        {
            int x,n,sum;
            scanf("%d",&x);
            scanf("%d",&n);
            for(x=1;x<=n;x++)
            {
                sum=0;
                sum=sum+x;
            }
           printf("1
        %d",sum);
            
        }
        
      • Writeup

        #include <stdio.h>
        int main()
        {
            int a;
            int sum=0;
            while((scanf("%d",&a))!=EOF){
                for(int i=0;i<=a;i++)
                    sum = sum+i;
                printf("%d
        
        ",sum);
                sum = 0;
            }
            return 0;
        }
        
      • Review

        • 我的问题在于没有考虑连续读取的可能性,好像对输入输出有误解T-T
        • 有一个疑问:输入输出需要和sample一样的格式吗?
        • 本身是一个前N项和的累加问题,如果用公式法也是no accept,原因是S=(1+n)*n/2中乘法容易造成溢出,而循环累加的好处在于溢出的可能比较小。
    • 杭电OJ-1002

      • Description

        Given two integers A and B, your job is to calculate the Sum of A + B.

      • Input

        The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.

      • Output

        For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.

      • 手写代码@V1-20210805

        #include<stdio.h>
        #include<string.h>
        #define max 1005
        
        int main()
        {
            int a[max],b[max],c[max];
            while(~scanf("%s1 %s2",s1,s2))
            {
                int i,j,k;
                i=0;j=0;
                k=strlen(s1)>strlen(s2)?strlen(s1):strlen(s2)
                
                for(i;i<=k;i++)  //k有无定义的必要?
                {
                    a[]=s1;   //好像不太合适?字符数组能直接赋值给数组吗?查一下书
                    b[]=s2;   //似乎需要循环读入?
                    
                    c[i]=a[i]+c[i];
                    if(c[i]>=10)
                    {
                        c[i]=c[i]%10;
                        c[i+1]++;         //s2的长度是必要的吗?
                    }
                }
                for(j=0;j<=k;j++)
                {
                    printf("%d",a[j]);   //哪里有点奇怪
                }
            }
            
            
        }
        
      • v1现在存在的问题

        • 读入的顺序和相加的顺序不太对?要处理一下?[n-i]好像可行?
        • 输出的时候应该是逆序?
        • 需要加一个读入的限制条件:读取正整数?
        • 题目要求的输入输出 用一个循环?
      • 手写代码@V2-20210806

        #include<stdio.h>
        #include<string.h>
        #define max 1010
        
        int main()
        {
        	int T,u,n,i,j;
            char s1[max],s2[max],c[max];
        	scanf("%d",&T);
        	while(T>=1 && T<=20)
        	{
        		for(u=0;u<=T;u++)
        		{
        			scanf("%s %s",s1,s2);
        		}	
        		
        		 n =strlen(s1)>strlen(s2)?strlen(s1):strlen(s2);
        		 
        		 for(i=2 ; i<=n ; i++)
                         {
                            c[n-i]=s1[n-i]+s2[n-i];
                                if(c[i]>=10)
                                    {
                                        c[n-i]=c[n-i]%10;
                                        c[n-i-1]++;         //没有考虑不是同位数的情况
                                    }
                          } 
                         
        		
                         for(j=0;j<=n;j++)
                         {
                            printf("case %d:
        ",u);
                            printf("%s + %s = %d
        ",s1,s2,c[j]);   
                         }     
                    
        	}
        	
        }
        
      • writeup-0806

        #include<stdio.h>
        #include<string.h>
        #define max 1000+10
        
        /**
         * 1. define the variable
        **/
        
        int a[max],b[max];    
        char str1[max],str2[max];  
        
        int main(){
        
        	int m;    //test number T?
        	int k=1;
        	scanf("%d",&m);  // read T?
        
        /**
         *2.read number and make sure input.
          this part is to read the big number and covert to array
        **/
        
        	while(m--){  //this circle ie funny! it's better than mine which use more variable u.              
                             
                scanf("%s %s",str1,str2);  //read big number
                memset(a,0,sizeof(a));    
                memset(b,0,sizeof(b));  //memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。
        
                int i,j;
                for(i=0,j=strlen(str1)-1;i<strlen(str1);i++){     //it's similar to my code ,i use the i=1 to replace len 
                a[j--]=str1[i]-'0';   //string1 covert to array1?
        	}
         
        	for(i=0,j=strlen(str2)-1;i<strlen(str2);i++){      //two strlen conditions,less code ,nice~
        	b[j--]=str2[i]-'0';    //string2 to array2?  why not combine with above 'for cicle' together ?
        	}
        /**
         * 3. add two big number 
        **/   
        	for(i=0;i<max;i++){
        		a[i]+=b[i];
        		if(a[i]>=10){
        			a[i]-=10;     //mine : a[i]=a[i]%10
        			a[i+1]+=1;    //similar~
        		}
        	}
        /**
         * 4.output
         * 
        **/
        	printf("Case %d:
        ",k++);   // k has been defined and value=1?
        	printf("%s + %s = ",str1,str2);   
            for(i=max-1;(i>=0)&&(a[i]==0);i--); //reverse output?(i>=0)&&(a[i]==0) what's mean? only deal the 10?
        	if(i>=0){
        		for(;i>=0;i--){
        			printf("%d",a[i]);
        		}
        	}
        	else printf("0");
        	if(m!=0) printf("
        
        ");
        	else printf("
        ");                   //not clear..
        	}
        	return 0;
        }
        
      • Review

        • 大数加法问题一般考虑数组进行存储,然后按位相加满十进一。
        • 再看Writeup时发现大家再提java,import java.util.Scanner,以及大数需要import java.math.BigInteger,且BigInterger相加不是"a+b",而是"a.add(b)",就可以很好的解决大数问题。
      import java.util.Scanner;
      import java.math.BigInteger;
      public class Main{
          public static void main(String args[]){
              BigInteger a,b;
              int T;
              int n=1;
              Scanner in = new Scanner(System.in);
              T=in.nextInt();
              while(T>0){
                  a=in.nextBigInteger();
                  b=in.nextBigInteger();
                  System.out.println("Case "+n+":");
                  System.out.println(a+" + "+b+" = "+a.add(b));
                  if(T!=1) System.out.println();
                  T--;
                  n++;
              }
          }
      }
      
    • 杭电OJ-1089

      • Input

        The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

      • Output

        For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

      • **Mine **- accepted

        #include<stdio.h>
        
        int main()
        {
        
            int a,b;
            while(~scanf("%d %d",&a,&b))
            {
                printf("%d
        ",a+b);
            
            }
            return 0;
        
        }
        
    • 杭电OJ-1090

      • Input

        Input contains an integer N in the first line, and then N lines follow. Each line consists of a pair of integers a and b, separated by a space, one pair of integers per line.

      • Output

        For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

      • Mine

        #include<stdio.h>
        
        int i,a,b,c;
        int main()
        {
        	while(~scanf("%d",&i))
        	{
        		for(c=1;c<=i;c++)
                {
                    scanf("%d %d",&a,&b);
                    printf("%d
        ",a+b);
        		}
        	}
        }
        
    • 杭电OJ-1091

      • Input

        Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed.

      • Output

        For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

      • Mine

        #include<stdio.h>
        
        int a,b;
        int main()
        {
        	while(~scanf("%d %d",&a,&b))
        	{
        		if(a==0 && b==0)
        		{return 0;}
        		else
        		{
        			printf("%d
        ",a+b);
        		}
        	}
        }
        
    • 杭电OJ-1092

      • Input

        Input contains multiple test cases. Each test case contains a integer N, and then N integers follow in the same line. A test case starting with 0 terminates the input and this test case is not to be processed.

      • Output

        For each group of input integers you should output their sum in one line, and with one line of output for each line in input.

      • Mine

        #include<stdio.h>   //始终是wrong...
        
        int main()
        {
        	int a,n,sum;
            while(scanf("%d",&n)!=EOF && n!=0)
            {
                while(n--)
                {
                	scanf("%d",&a);
                	sum=0;
                	sum+=a;
                }   
               printf("%d
        ",sum);    
            }
            return 0;
        }
        
      • Writeup

        #include<stdio.h>
        int main()
        {
        	int a[10000];
        	int n, i, s;
        	while (scanf("%d", &n) && n)  
        //输入正确scanf返回1,n!=0继续输入
        	{
        		for (i = s = 0; i < n; i++)
        			scanf("%d", &a[i]);
        		for (i = 0; i < n; i++)
        		{
        			s = s + a[i];
        		}
        		printf("%d
        ", s);
        	}
        	return 0;
        }
        
        
      • Review

        没有考虑到大数的可能,存在溢出问题,用数组存放更为合理

    • 杭电OJ-1093

      • 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 with one line of output for each line in input.

      • Mine

        #include<stdio.h>   //wrong answer...
        
        int main()
        {
        	int i,j,k,s;
        	int a[1000];
        	while(~scanf("%d",&i))
        	{
        		for(i;i>=1;i--)
        		{
        			while(scanf("%d",&j)!=EOF && j)
        			{
        				for(j;j>=0;j--)
                        {
                           scanf("%d", &a[i]); 
                        }
                        for (k= 0; k< j; k++)
                        {
                            s += a[i];
                        }
        		printf("%d
        ", s);
        			}
        		}
        	}
        }
        
        
      • writeup

        #include<stdio.h>
        int main()
        {
        	int n,i,m,sum;    //n是行数,m是加数个数
        	scanf("%d",&n);
        	while(n--)  //简洁!
        	{
        		sum=0;	
        	    scanf("%d",&m);
        		while(m--)    //两个-- 简洁欸!
        		{
        			scanf("%d",&i);
        			sum=sum+i;
        		}	
        		printf("%d
        ",sum);	
        	}
        	return 0;
        }	
        
      • Review

        所以上一道题不是大数的原因?? (((φ(◎ロ◎;)φ)))

    • 杭电OJ-1094

      • Input

        Input contains multiple test cases, and one case one line. Each case starts with an integer N, and then N integers follow in the same line.

      • Output

        For each test case you should output the sum of N integers in one line, and with one line of output for each line in input.

      • Mine

        #include<stdio.h>
        
        int main()
        {
        	int n,m,sum;
        	while(~scanf("%d",&n))
            {
                sum = 0;
                while(n--)
                {
                    scanf("%d",&m);
                    sum += m;
                }
                printf("%d
        ",sum);
            }
        }
        
    • 杭电OJ-1095

      • Input

        The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

      • Output

        For each pair of input integers a and b you should output the sum of a and b, and followed by a blank line.

      • Mine

        #include<stdio.h>
        int main()
        {
        	int a,b;
        	while(~scanf("%d %d",&a,&b))
        	{
        		printf("%d
        ",a+b);
        		printf("
        ");
        	}
        	return 0;
        }	
        	
        
        
    • 杭电OJ-1096

      • 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.

      • Mine

        #include<stdio.h>
        int main()
        {
        	int n,m,i;
        	int sum;
        	while(~scanf("%d
        ",&n))  //行数
        	{
        		while(n--)
        		{
        			scanf("%d",&m);   //加数个数
        			sum = 0;
        			while(m--)
        			{
        				scanf("%d",&i);
        				sum += i;
        			}
        			printf("%d
        ",sum);
        			if(m!=0)
        			printf("
        ",sum);
        		}
        	}
        }
        
  • 相关阅读:
    17.10.13
    17.10.12
    17.10.11
    17.10.10
    17.10.05
    17.10.04
    17.10.03
    17.10.02
    17.10.01
    17.9.29
  • 原文地址:https://www.cnblogs.com/blazarstar/p/15122408.html
Copyright © 2011-2022 走看看