HDU-1097 A hard puzzle 题解以及关于超时问题的处理

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1097

这道题目其实相对来说也是一道比较简单的题目,本来没必要在这里贴出来的,但是因为中间涉及到了一个Time Limit Exceeded ,所以感觉到还是有必要在这里提出来的,毕竟是”第一次“遇到这种情况。

  这道题我看到的时候觉得没什么难的,直接就循环就写起来了,当然在此之前特别注意了一下,范围2的30次方是在int的范围内的,所以直接用了整型。想法就是既然只涉及最后一位数字,那就直接ans*=a%10;ans=ans%10;然后循环b次,本地测试和自己另外找的几个数据测试都没什么问题,所以就愉快的去提交了,然而结果很不令人愉快:Time Limit Exceeded。因为我使用的Java,Java在处理输入输出的时候速度是C/C++的十倍左右,但是时间限制却只是它们的两倍,我认为是数据量大用Java才超时了,所以我有愉快的用C++写了交上了,当然结果让我更不愉快了:又是Time Limit Exceeded!我表示很不开心!

  当然呢,一看题,如果循环b次的话,b很大时,比如b=299 999 999时,就要执行这么多次循环,自然就超时了。稍微对数据计算一下,就明显可以得出规律:以10个数字结尾的n次方的最后一个数全都是每乘四次完成一个循环(其中有一直不变和两个数一循环的),那么我们做一下简单处理就可减少循环次数:直接对b取4的余数,那么只需要进行最多4次循环就OK了,代码也不过是在原有循环之前加上 b=b%4;if(b==0)b+=4;就可以了,提交果然AC。

  这个问题虽然很简单,解决方法也显而易见。但是,这里体现了一个非常重要的问题,面对Time Limit Exceeded,我们怎么去解决?

  Time Limit Exceeded意思就是超时,也就是意味着虽然你在时限范围之内的测试数据是正确的(但注意不一定是所有数据都正确),但是你的运行时间超了。那么解决问题大概有以下几种:

  ①如果是大量的输入和输出,那么你就需要考虑你使用的语言的输入输出的效率了。一般而言,Java的输入输出是耗时最长的,C++的cin,cout耗时虽然比起Java好得多,但是比起C语言的scanf和printf来说还是慢了很多。所以如果是大量的输入输出,那么你就要考虑一下是否是这方面的问题,或许换个输入输出问题就解决啦!

  ②当然上面的那种情况是比较少见的,最常见的 Time Limit Exceeded问题所在都在算法,比如说我这个问题上遇到的就是关于算法的问题,当然,这个算法比较简单。我们在做复杂一点的题目的时候,往往会遇到一些问题我们用多重循环或者遍历枚举都可以简单解决,但是提交之后往往就是TLE,这就是算法的问题了,这种解法一般称之为”暴力解法“,虽然不错但是并不符合题目要求。因为它的时间复杂度太高,具体时间复杂度的算法大家可以自行百度一下(因为我也不怎么会  T _ T)。这个时候大家就要多找找有没有循环啦,优化自己的算法时间复杂度,或者用学到的一些算法来替代自己的”暴力解法“,问题一般就能得到解决啦。

  加油!!!!下面是这道题的Java代码和C++代码,其实都差不多,既然都写了就都放上好了。(C++没交,应该是可以AC的。Java解法是AC过的)

HDU-1097 Java代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while (input.hasNext()) {
			int a=input.nextInt(), b = input.nextInt(),ans=1;
			b=b%4;
			if(b==0)
				b+=4;
			for(int i=1;i<=b;i++)
			{
				ans*=a%10;
				ans=ans%10;
			}
			System.out.println(ans);
		}
	}
}

HDU-1097 C++代码

#include<iostream>
using namespace std;
int main()
{
       int a,b;
		while (cin>>a>>b && a && b) {
			int ans=1;
			b=b%4;
			if(b==0)
			b+=4;
			for(int i=1;i<=b;i++)
			{
				ans*=a%10;
				ans=ans%10;
			}
			cout<<ans<<" ";
		}
}
  Come on,baby~~~做一只粪斗的好青年~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值