#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;const static int M = 50;int numA[M];
int numB[M];//使用string重置numA
void resetNumA(string numAStr)
{memset(numA,0,M*sizeof(int));//将字符串的每一位都转换成数字传入数组for (int i = 0; i < numAStr.length(); i++){numA[i] = numAStr[numAStr.length()-i-1] - '0';}
}//使用string重置numB
void resetNumB(string numBStr)
{memset(numB,0,M*sizeof(int));//将字符串的每一位都转换成数字传入数组for (int i = 0; i < numBStr.length(); i++){numB[i] = numBStr[numBStr.length()-i-1] - '0';}
}//将数组转换为字符串,用于输出
string getNumString(int* num)
{string numString;bool isBegin = false;for (int i = M-1; i >= 0 ; i--){if(num[i] != 0){isBegin = true;}if (isBegin){numString += num[i] +'0';}}return numString;
}//判断两个数字哪个大
int compare(string numAStr,string numBStr)
{if (numAStr.length() > numBStr.length()){return 1;}else if (numAStr.length() < numBStr.length()){return -1;}else{for (int i = 0; i < numAStr.length(); i++){if (numAStr[i]>numBStr[i]){return 1;}if (numAStr[i]<numBStr[i]){return -1;}}return 0;}
}//加法
string add(string numAStr, string numBStr)
{resetNumA(numAStr);resetNumB(numBStr);for (int i = 0; i < M; i++){//结果保存在numA中numA[i] += numB[i];//数字大于9则进位if(numA[i]>9){numA[i] -= 10;numA[i+1]++;}}return getNumString(numA);
}//减法
string ab(string numAStr, string numBStr)
{bool isNegative = false;//如果numA比numB小//则结果为负数//调换位置进行计算if (compare(numAStr,numBStr)==-1){isNegative = true;string temp = numAStr;numAStr = numBStr;numBStr = temp;}else if (compare(numAStr,numBStr)==0){return "0";}resetNumA(numAStr);resetNumB(numBStr);for (int i = 0; i < M; i++){//减数小于被减数就借位if (numA[i]<numB[i]){numA[i] = numA[i]+10-numB[i];numA[i+1]--;}else{numA[i] -= numB[i];}}if (isNegative){return "-"+  getNumString(numA);}else{return getNumString(numA);}}//乘法string mul(string numAStr, string numBStr)
{resetNumA(numAStr);resetNumB(numBStr);vector<string> nums;for (int i = 0; i < numBStr.length(); i++){//初始化一个临时数据来保存被乘数与乘数的某一位相乘的结果int temp[M];memset(temp,0,M*sizeof(int));for (int j = i; j < numAStr.length()+i; j++){temp[j] += numA[j-i]*numB[i]%10;temp[j+1] = numA[j-i]*numB[i]/10;//如果大于9,那么就做进位处理if (temp[j]>9){temp[j]-=10;temp[j+1]++;}}nums.push_back(getNumString(temp));}//每位相乘的结果再用加法加起来string result = nums[0];for (int i = 1; i < nums.size(); i++){result = add(result,nums[i]);}return result;
}//除,结果精确到个位
string div(string numAStr, string numBStr)
{resetNumA(numAStr);resetNumB(numBStr);string result;string left;if (compare(numAStr,numBStr)==-1){return "0";}//标记第一个不为0的位数的出现bool flag = false;for (int i = 0; i < numAStr.length(); i++){left +=numAStr[i];//余数比除数大if (compare(left,numBStr)==1){flag = true;int cnt = 1;string temp = numBStr;while (true){//每循环一次加上一个余数temp = add(temp,numBStr);//余数仍然大于除数,继续累加if (compare(left,temp)==1){cnt++;}//余数小于除数//可以计算结果else if (compare(left,temp)==-1){result += cnt + '0';left = ab(left, ab(temp,numBStr));break;}//此时余数刚好是除数的倍数else if (compare(left,temp) == 0){cnt ++;result += cnt + '0';left = "";break;}}}//刚好除尽else if(compare(left,numBStr)==0){flag = true;result +="1";left = "";}//余数比除数小,跳到下一位else if(flag&&compare(left,numBStr)==-1){result +="0";left="";}}return result;
}int getMod(string s)
{int len=s.length();int ans=0;for(int i=0;i<len;i++)ans=(ans*10+s[i])%2;return ans;
}int main()
{int t;scanf("%d",&t);while(t--){string str;cin>>str;string s1="1",s2="2";string str2=div(str,s2);string ans=mul(str2,ab(str2,s1));if(getMod(str)==1)ans=add(ans,ab(div(add(str,s1),s2),s1));cout<<ans<<endl;}
}

转载于:https://www.cnblogs.com/atmacmer/p/5441308.html

#大数加减乘除#校赛D题solve相关推荐

  1. 武理校赛A题 ljw的剥削(思维 + map应用)

    武理校赛A题 ljw的剥削(思维 + map应用) 牛客链接 题意: 给定 a[],b[] 两个长度同为 n 的数组,经过一系列操作后, 使 p = ∑ i = 1 n m a x ( ( a i − ...

  2. SDUT 校赛 D题 魔戒(bfs+四维数组)

    魔戒 Time Limit: 1000MS  Memory Limit: 65536KB Problem Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我 ...

  3. QAU 18校赛 J题 天平(01背包 判断能否装满)

    问题 J: 天平 时间限制: 1 Sec  内存限制: 128 MB 提交: 36  解决: 9 [提交][状态][讨论版][命题人:admin] 题目描述 天平的右端放着一件重量为w的物品.现在有n ...

  4. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛E题小Y吃苹果

    链接:https://www.nowcoder.com/acm/contest/91/E 题意: 小Y买了很多苹果,但他很贪吃,过了几天一下就吃剩一只了.每一天小Y会数出自己的苹果个数X,如果X是偶数 ...

  5. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

    题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...

  6. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛A题Wasserstein Distance

    题目链接:https://www.nowcoder.com/acm/contest/91/A 题意:给两组数据,求把A变成B状态需花费的最小体力. 思路:s=s+abs(a[i]-b[i]);a[i+ ...

  7. 东北大学5月校赛c题

    Problem Description When you arrived at Charles de Gaulle airport, you naively accepted a ride to Pa ...

  8. 十九届 浙大 校赛 A题 Thanks, TuSimple!

    题目链接: http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5969 Thanks, TuSimple! Time ...

  9. 西交2021校赛 J题校赛质量

    彩彩在视频网站上拥有N个粉丝,并且发布了M个视频,编号为0,1,-,M-1 .粉丝会为编号连续的视频点赞,其中第 i 个粉丝选择为 (表示大于等于 并且严格小于 的整数范围)的视频点赞.该网站对视频质 ...

  10. Little Sub and Piggybank (杭师大第十二届校赛G题) DP

    题目传送门 题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数.如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值. 思路:先来一段来自出题人的题解: 显然的贪心:如果 ...

最新文章

  1. OPEN(SAP) UI5 扫盲
  2. HttpClient工具类
  3. 创建表空间创建用户以及用户授权
  4. [Java基础]TreeSet集合概述和特点
  5. Android基于mAppWidget实现手绘地图(二)--概要
  6. 关于Navicat 连接mysql报11001错误
  7. python输入学生成绩计算平均值_从用户输入中计算和、积和平均值
  8. MySql 查询比其中某一位讲师工资少的教师姓名、工资和职称
  9. 百度UEditor视频相关bug汇总和解决方案
  10. uniapp textarea编辑保留空格换行
  11. 鲜为人知而又实用的 Linux 命令大全
  12. 一个正在开发中的 Python3 贪吃蛇游戏
  13. python 双重差分_双重差分的理论与实践
  14. 百度SEO:如何进行网站关键字挖掘!
  15. 计算机网络 王道考研2021 第六章:应用层 -- 文件传输协议FTP、电子邮件SMTP、POP3
  16. 震惊!!C++居然可以发出声音!
  17. GSEA富集分析 - 界面操作
  18. 错误There are no TAP-Windows adapters on this system. You should be able to create a TAP
  19. 事业编招聘:雄安新区公开选聘专业骨干人才
  20. 用单片机控制液体采样泵

热门文章

  1. completion time, flow time和processing time 区别
  2. CI 什么是构建 gradle
  3. 区块链 solidity 快排
  4. JDBC06 其他操作及批处理Batch
  5. c语言编码菱形用换行吗,使用c语言输出菱形
  6. JFreeChart 简单使用
  7. Scala map中下划线_._2的含义
  8. 字符串转换为小数(如String a=“123“),转换之后为123.0
  9. java继承求三角形圆形面积_Java - 三角形与圆形面积
  10. Python 最抢手、Java 最流行,前线程序员揭秘 2019 软件开发现状