#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. IOS7学习之路八(iOS 禁止屏幕旋转的方法)

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { retu ...

  2. XSD实例

    XSD实例 在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改), ...

  3. cocos2dx android运行Luac编译后的lua代码

    环境: win7 64 cocos2d-2.1rc0-x-2.1.2 lua 5.1 通常我们编写好的lua代码都是明文形式,谁都可以查看修改,为了防止自己的劳动成果不被别人轻易的盗取,可以使用lua ...

  4. 关于iOS UIScrollView放大的问题

    总所周知 ,iOS 的UIScrollView是专门用来做缩放和分页用的,关于这方面的例子也很多了,但你们知道在放大的过程中 他做了些什么吗?  他的哪些东西会发生改变吗? 通过在一个项目中的小经历 ...

  5. 如何简单而优雅地升级Visual NMP中的PHP版本

    需求:自己想测试下不同版本的PHP性能,就想升级下 Visual 这个集成环境中PHP的版本 网上: 升级PHP到5.6.11 1.下载新的nts版的PHP并解压缩到bin\PHP下,保留原文件夹的名 ...

  6. 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题

    谢天谢地...差点因为在linux下面phpmailer发送邮件失败转到了window+IIS... Godaddy的linux服务器无法用phpmailer发送(我用的是网易的邮箱服务器...虽然现 ...

  7. Docker ( Is docker really better than VM ?)

    Docker is so popular. Arha? Let's try! Docker needs the linux kernel shoud be upper than 3.10.x Let' ...

  8. android fragment addToBackStack bug

    In FragmentActivity.First, I add two fragment by FragmentTransaction. See the flowing code : /****** ...

  9. C语言实现修改文本文件中的特定行

         最近由于项目需要实现修改文件的功能,所以,博主认真查阅了一些资料,但是,很遗憾,并没有太多的收获. 好的,首先我先叙述下功能要求: 其实很简单,就是Shell中sed命令的C语言实现,实现定 ...

  10. kubernetes入门之skydns

    部署kubernetes dns服务 kubernetes可以为pod提供dns内部域名解析服务.其主要作用是为pod提供可以直接通过service的名字解析为对应service的ip的功能. 部署k ...