杂题一则-最后的三位数

        在写作业的时候遇到一道比较有意思(让人debug到难受)的题目,找不到一个合适的主题,权当作是分享给大家。

最后的三位数

        题目:计算a的n次方的最后三位数,这里的a<150,要求输出这一个阶乘运算之后结果的最后的三位数。

        我本想用long long直接暴力解决数据溢出问题,但是实际上还是超了,所以这个时候就需要在次方的过程中对数据进行调整

        关于调整的方法:只要数据超过1000,就可以用这个数字去模1000,用余数计算,这样不会改变最终的结果,举个例子:

8*8=64;64*8=512;512*8=4096;这个时候无论是直接输出结果,还是先取模,结果都是096

再往后算:

        4096*8=32768,96*8=768,这样的运算说明一边次方,一边取模的运算不会改变最终最后的三位数的输出。 就此,算法设计结束。关于算法的实现如下:

	int i=1;
	int z=1;
	for(i;i<=n;i++)
	{
		z=(z*a)%1000;
	}

        到这里就不得不提一个问题,就是补不补0的问题,就像刚才的例子,8^4=4096,输出096,但是8^2=64,输出64,这里的输出就取决于初始结果。

        考虑到这里,这道题也就没有其他雷点了,完整代码如下:

int main()
{
	int a=0;
	int n=0;
	scanf("%d %d",&a,&n);
	int i=1;
	int z=1;
	for(i;i<=n;i++)
	{
		z=(z*a)%1000;
	}
	if(pow(a,n)<1000)
	{
		int k=pow(a,n);
		printf("The last 3 numbers is %d.\n",k);
		goto end;
	}
	printf("The last 3 numbers is %03d.\n",z);   
  // 原始数据大于1000,输出三位数右对齐,空余位补0

	end:
	return 0;
} 

许多年来,货物生产商都会把超市售卖的每件商品上放置一个条码。这种被称为通用产品代码(Universal Product Code,缩写UPC)的条码可以识别生产商和产品。超市可以通过扫描产品上的条码来确定支付此项商品的费用。每一个条码由十二位数字构成,通常这些数字会显示在条码下面。例如,包装为26盎司的Morton牌碘化盐所用条码下的数字是: 0 24600 01003 0 第一个数字表示商品的种类(0表示大部分的食品货,2表示需要称量的货品,3表示药品或和健康相关的商品,而5表示优惠券)。接下来的一组五位数字用来识别生产商。而第二组五位数字则用来区分产品类型(其中包括包装尺寸)。最后一位数字是“校验位”,它可以帮助鉴别先前数字中的错误。如果条码扫描出现错误,那么前十一位数字和最后一位数字可能会不一致,而超市扫描机也会拒绝整个条码。 下面是一种计算校验位的方法:首先把第一位、第三位、第五位、第七位、第九位和第十一位数字相加。然后把第二位、第四位、第六位、第八位和第十位数字相加。接着把第一次加法结果乘以3后再加上第二次加法的结果。随后,再把上述结果减去1。减法后的结果除以10取余数。最后,用9减去上一步骤中得到的余数。现在以Morton碘盐为例,第一组数字的加法是0+4+0+0+0+3=7,而第二组数字的加法是2+6+0+1+0=9。把第一组加法值乘以3后再加上第二组加法值得到的结果是30。再减去1,结果变为29。再把这个值除以10取余数为9。9在减去余数结果9,最终值为0。 输入 每次输入三行数据,第一行是UPC的第一位数字,第二行是UPC的第一组五位数字,第三行是UPC的第二组五位数字。 输出 UPC的校验位 提示 本有隐藏测试用例。如果想多找不同的实例验证你的算法,可以拿身边书或食品背后的条码测试一下。 Test Input Expected Output Time limitation Memory limitation Extra process number Test Case 1 View plain 0↵ 24600↵ 01003↵ View plain 0↵ 1 seconds 256M 0
最新发布
05-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值