• hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b


    hdoj上一道有意思的题目,题目:
    人见人爱a+b
    敲的也蛮快的,大概十分钟左右就AC了。代码如下:

    人见人爱a+b

    #include<stdio.h>
    int main()
    {
    	int n,i,j,a1,a2,a3,b1,b2,b3,c1=0,c2=0,c3=0;//c1记录小时,c2记录分钟,c3记录秒;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&b1,&b2,&b3);
    		c3=a3+b3;
    		if(c3>=60)
    		{
    			c3=c3-60;
    			c2++;//分钟+1;
    		}
    		c2=c2+a2+b2;
    		if(c2>=60)
    		{
    			c2=c2-60;
    			c1++;//小时+1;
    		}
    		c1=c1+a1+b1;
    		printf("%d %d %d
    ",c1,c2,c3);
    		c1=0;
    		c2=0;
    		c3=0;
    	}
    	return 0;
    }
    

    这题蛮有意思的,与往常的a+b题目不同,这里的a和b有一定的范围,它和时间计数的小时分钟秒类似,其中的分钟和秒的具体范围是0-60,于是相加以后就要判断有没有超出范围,有的话小时+1或者分钟+1。

    回顾之前的面向对象程序设计课第二次作业,其题目也是不走寻常路,我在之前的博客也记录了它:程序设计第二次作业
    这里来说说A+B*C和A+B/C的情况。

    一、A+B*C

    要求:输入均为整数,数值范围在(-1000000,1000000)之间。
    代码如下:

    #include <stdio.h>
    int main()
    {
        int a, b,c,n;
        scanf("%d %d %d",&a,&b,&c);
        n=a+b*c;
        if(n<0)
        {
            printf("-");//输出“-”号
            n=-n;//取其绝对值
        }
        if(n<1000) printf("%d
    ",n );
        else if(n<1000000) printf("%d,%03d
    ",n/1000,n%1000 );
        else printf("%d,%03d,%03d
    ",n/1000000,n%1000000/1000,n%1000 );//判断n的范围,用0补充位数
        return 0;
    }
    

    A+B*C的做法与第二次作业的做法类似,用n来记录a+b*c的值,首先取其绝对值,如果是负数输出-号;再进行范围判断,通过%03d来补充位数。

    二、A+B/C

    要求:输入均为整数,数值范围在(-1000000,1000000)之间。保留两位小数。
    代码如下:

    #include<stdio.h>
    int main()
    {
    	int a,b,c,intn=0,intp=0;
    	double dout=0,doum=0;
    	scanf("%d%d%d",&a,&b,&c);
    	
            intn=a+b*1.0/c;//n is int; mistake: b*1.0/c;
    	dout=a+b*1.0/c;//t is double; mistake: b*1.0/c;
    	doum=dout-intn;//doum : decimal
    	intp=doum*100;//intp : (int)decimal*100
    	
    	if(intp<0)intp=-intp;// |intp|;
    	
    	if(intn<0)
        {
            printf("-");
            intn=-intn;
            
        }
        if(intn<1000) printf("%d",intn );
        else if(intn<1000000) printf("%d,%03d",intn/1000,intn%1000 );
        else printf("%d,%03d,%03d",intn/1000000,intn%1000000/1000,intn%1000 );
        
    	printf(".%02d",intp);//print the part of decimal 
    	
    	return 0;
    }
    //-10 1 3
    //-10 1 4
    //-1000000 1 3
    //1000000 1 4
    //-1000 9 1
    

    要求二相对要求一和之前的题目来说更难一些,我简单的阐述一下我的思路:
    我定义整形变量intn和intp,intn来存储a+b/c的整数部分,intp来存储a+b/c的小数*100,也就是说我输出的时候,整数部分交由之前的方法处理,输出整数部分以后输出.和intp的绝对值。
    取小数部分的做法:我先用一个int变量intn存储a+b/c的值,再用double类型的变量dout存储a+b/c的值,用两个值作差来得到小数部分,用double类型的doum来存储,最后intp把doum*100存储(相当于小数点后两位的数字)。
    还有一个注意点是,最后我输出的格式:printf(".%02d",intp);用0补充位数。

    遇到的问题:

    在之前的代码里,我在给intn赋值的语句是:intn=a+b/c,这这导致b/c的计算结果是0,而不是我想要的0.33。
    改进:intn=a+b*1.0/c

    通过这一类型的题目,让我巩固了一些遗漏的知识点。a+b看似很简单,但是其中的题目还是隐藏着“杀机”。

                                                                                                                 2016/2/26
  • 相关阅读:
    info命令简介
    scheme代码返回3个数中较大2个数之和
    mitscheme的标准库函数
    如何理解认知
    mitscheme编辑和装入程序文件
    scheme格式化输出字符串
    SQLServer中批量导出所有作业或链接脚本
    DAMA学习笔记(1)
    SQLServer AlwaysON修改可用性组的监听端口
    SQLServer将数据库置为只读
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5217796.html
Copyright © 2020-2023  润新知