#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;
}
}

#大数加减乘除#校赛D题solve的更多相关文章

  1. PKU2018校赛 H题 Safe Upper Bound

    http://poj.openjudge.cn/practice/C18H 题目 算平均数用到公式\[\bar{x}=\frac{x_1+x_2+x_3+\cdots+x_n}{n}\] 但如果用in ...

  2. 2018WFU校赛B题

    我们在ACM的题目中已经了解了什么是ACM了,ACM还是很残酷的了(ಥ _ ಥ),那么现在你就要解决一个ACM最简单的题了,简单到省赛和区域赛都不会出这种简单的题.ls很强,即使每年都在ACM这个大坑 ...

  3. CSU 1425 NUDT校赛 I题 Prime Summation

    这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[ ...

  4. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

  5. QAU 17校赛 J题 剪丝带(完全背包变形)

    题意: 剪一段丝带,对于剪完后的每一段丝带长度必须是a,b,c 输入丝带的长度  n 和  a  b  c 输出一个整数,代表最多能剪成多少段 样例输入 5 5 3 2 7 5 5 2 样例输出 2 ...

  6. 上海高校金马五校赛 F题:1 + 2 = 3?

    链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...

  7. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

  8. 福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt

    第九集,结束亦是开始 题意: 大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m) 思路: 这个是一个防ak题,做法是要手推公式的fwt 大概就这 ...

  9. 福建工程学院第十四届ACM校赛G题题解

    外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...

随机推荐

  1. 图解JS的传值与传址

    //编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...

  2. 如何去除AJAX收到数据中包含的html页面数据

    问题: 如下代码所示,我用AJAX收到来自url: 'kzkj_check.jsp',返回的数据msg,总是包含页面的html数据,可是我只想要我返回的数据“false”, $.ajax({ url: ...

  3. MongoDB学习(翻译5)

    C#驱动序列化文档对象 介绍 本文档基于C#官方驱动1.8版本. 本节C#驱动教程谈论C#类到BSON对象的序列化和反序列化.序列化是映射一个对象到可保存到MongoDB库中BSON对象的过程,反序列 ...

  4. WordPress 4.3 Beta 1 全新发布,改进了后台功能和用户体验

    WordPress 4.3 Beta 1 发布,此版本是开发版本,不建议在生产环境使用.如果要测试 WordPress 4.3 Beta 版本,可以使用 WordPress Beta Tester 插 ...

  5. ckeditor:复制内容到ckeditor时,只保留文本,忽略其样式解决方法

    打开ckeditor 包下的config.js,在 CKEDITOR.editorConfig= function(config){...}添加一句配置: config.forcePasteAsPla ...

  6. 采用SOLR进行全文索引的完整解决方案,设计图

  7. Klockwork告警常见错误

    下面列举的是Klockwork告警中常见的告警形式,这些情况在编译阶段都不会报出来语法上的错误,并且在运行阶段执行到的概率很小.但是在某些场景下一旦执行到了这些语句, 很可能引起进程的跑飞和挂起.   ...

  8. python tornado nginx deployment tornado 的部署在linux Nginx服务器

    题外话: 这里分享一个链接是将Flask 和 Apache 用 mod_wsgi 来进行传唤的部署方式,在digital ocean VPS 上的. https://www.digitalocean. ...

  9. GIT 版本控制命令学习

    一   基本命令 1.$ git init 要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行: 2.$ git status 检查当前文件状态 3.git add命令 功能1:可以 ...

  10. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...