我是靠谱客的博主 英勇母鸡,最近开发中收集的这篇文章主要介绍高精度乘法-17南宁区域赛F -The Chosen One,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目大意:给你一个n,然后从1~n隔一个选一个,挑出一个集合然后从集合中继续隔一个挑一个,直到只有一个数,问最后一个数是多少?2<=n<=1050

例如n=5,先选出2,4最后选择4。n=12,先选出2,4,6,8,10,12,再选出4,8,12在选出8。

 

可以发现这个数字一定是偶数,并且是比n小中被2除最多次的一个数,所以发现就是找一个2的幂次的小于n的最大的数。代码如下:

 

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
string a[100005];
int t[1000005];
bool judge(string n,string a)
{
if(n.size()<a.size())
return true;
else if(n.size()==a.size())
{
for(int i=0; i<a.size(); i++)
{
if(n[i]<a[i])
return true;
if(n[i]>a[i])
return false;
}
}
return false;
}
string fun(string a)
{
memset(t,0,sizeof(t));
for(int i=1; i<=a.size(); i++)
t[i]=(a[a.size()-i]-'0')*2;
for(int i=1; i<=a.size(); i++)
if(t[i]>=10)
{
t[i+1]+=t[i]/10;
t[i]=t[i]%10;
}
int len=a.size()+1;
string a1;
while(t[len]==0)
{
len--;
}
for(int i=len; i>=1; i--)
{
a1+=('0'+t[i]);
}
return a1;
}
int main()
{
int t;
cin>>t;
string n;
a[1]+='2';
while(t--)
{
cin>>n;
for(int i=1;; i++)
{
if(judge(n,a[i]))
{
cout<<a[i-1]<<endl;
break;
}
else
{
if(a[i+1].size()==0)
a[i+1]=fun(a[i]);
}
}
}
}

 

 

转载于:https://www.cnblogs.com/dongdong25800/p/10681714.html

最后

以上就是英勇母鸡为你收集整理的高精度乘法-17南宁区域赛F -The Chosen One的全部内容,希望文章能够帮你解决高精度乘法-17南宁区域赛F -The Chosen One所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部