zoukankan      html  css  js  c++  java
  • 进制+(高精度)——计算器

    ·这题虽然说是高精度题。。。但貌似并没有用到高精度这个玩意撒(⊙o⊙)…主要是高精思想(???)

    ·主要可以通过这题来更好了解复习进制转换。

    ·洛谷入口:P4282

    ·题目背景:2008安徽省选(实际就是到橙题)

    ·题目内容:

    小可可在欢乐岛的快乐旅程还在继续,他想买一些纪念品带回去给同学们,于是来到了礼品部,在这里他发现了一个有趣的计算器.

    这个计算器是一种特殊的、支持变进制整数加减运算的计算器(所谓变进制,就是每一位的进制可以不同.例如,如果最低位是3进制,次低位是5进制,那么这种情况的42转化成十进制就是4*3+2=14)。

    店主看小可可对这个计算器非常感兴趣,于是他问小可可:“小朋友,如果我告诉你这个计算器最多可以支持N位的变进制整数,且每一位的进制分别是x1…xn,那么你知道它能表示的最大整数M是多少吗?”,小可可想了想说到:“它所能表示的最大的整数M是(x1×x2…×xn)-l。”

    店主非常 高兴,说到:“你真是个聪明的孩子,如果我告诉你两个长度为N的变进制整数A,B,你按照我的要求来计算(A+B)mod(M+1)或(A-B)mod(M+1),答案还是用相同的变进制来表示,如果你算对了,那么我就把这个计算器送给你。”

    这下把小可可难住了,但是他非常想要这个计算器,聪明的你能够帮助小可可吗?

    ·主要思想:

    1.进制转换。

    2.关于对M取模感觉比整道题都难,但是,认真一看不难发现两个数a,b一定都小于M,所以绝不会超过2倍M,只要取后N位就可。

    ·代码:

    #include<iostream>
    using namespace std;
    const int maxn=100005;
    int jz[maxn],a[maxn],b[maxn];
    char op;
    int n;
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	cin>>jz[i];
    	for(int i=1;i<=n;i++)
    	cin>>a[i];
    	cin>>op;
    	for(int i=1;i<=n;i++)
    	cin>>b[i];
    	if(op=='+')
    	{
    		int x=0;//此为进位的数
    		for(int i=n;i>=1;i--)
    		{
    			int t=x+a[i]+b[i];//当前两数相加的值并加上进位的数
    			x=t/jz[i];//进位的值
    			a[i]=t%jz[i];//进位后变进制的数
    			}
    		}
    	else
    	{
    		for(int i=n;i>=1;i--)
    		{
    			a[i]=a[i]-b[i];
    			if(a[i]<0)
    			{
    				a[i-1]--;//向前一位进位
    				a[i]+=jz[i];
    /*此为一个小技巧:来举个例子吧。
    eg:
    				}
    			}
    		}
    	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    	cout<<endl;
    	return 0;
    } 
    
  • 相关阅读:
    HTTP协议学习笔记
    linux对文件某列求和
    mongodb拆库分表脚本
    mongodb基础应用
    mongodb实现对某列求和SUM
    员工价值——如何体现自己价值,如何被自己的领导认可
    使用MySQLMTOP监控MySQL性能(二)
    使用MySQLMTOP监控MySQL性能(一)
    apache+tomcat实现session共享
    apache+tomcat负载均衡3种实现方式
  • 原文地址:https://www.cnblogs.com/konglingyi/p/11323390.html
Copyright © 2011-2022 走看看