ACM 实验室2020.11.22天梯赛练习*7+天梯赛练习

 

7-58 连续因子 (20分)

这道题之前做过,当时用的vector把因子存起来再一个个判断,今天又用了另一种方法,对每一个因子,往后判断它后面的连续因子,然后有几个测试点改了好多次都没过

正确代码:

int main()
{
speed_up;
ll n;
cin>>n;
ll c=0,l=0;
for(ll i=2; i<=sqrt(n)+1; i++)
{
if(n%i==0)//遍历因子
{
ll m=i;//要定义一个m,把每个连续因子乘起来,判断能否被n整除,不能每次只判断下一个数能否被n整除
for(ll j=i+1;; j++)
{
m*=j;
if(n%m==0)//判断下一个数是否为因子
{
continue;
}
else
{
if(l<j-i)//找最长连续因子
{
l=j-i;
c=i;
//cout<<i<<" "<<j<<endl;
}
break;
}
}
}
}
if(l==0)
{
cout<<1<<endl<<n<<endl;//这里不能只单独判断奇数,要判断l是否为零来输出
}
else
{
cout<<l<<endl;
for(ll i=c; i<c+l; i++)
{
cout<<i;
if(i!=c+l-1)
cout<<"*";
else
cout<<endl;
}
}

}

7-47 整除光棍 (20分)

普通做法会超时,看了题解发现这样做不会超时,先找到比x大的最小的由1组成的数,然后做这样的循环:每次输出余数后再乘10加1再取模,直到把这个原始为1组成的数除尽

int main()
{
speed_up;
int x;
cin>>x;
ll l=1;
int c=0;//记录每次乘10加1后的值,即位数
while(l<x)//当l能除过x
{
l=l*10+1;
c++;
}
while(1)
{
cout<<l/x;
l%=x;//取模
if(l==0)break;//直到能除尽为止
l=l*10+1;
c++;
}
cout<<" "<<c+1<<endl;
}

7-61 天梯赛座位分配 (20分)

 

int main()
{
speed_up;
int n;
cin>>n;
int a[n];
vector<int>b[101];
int f[101]={0};//记录这个学校是否排完座位
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
a[i]=t*10;//存每个数组中队伍数
}
int i=1;//队伍号
int k=0;//记录有几个学校完成了座位的排列
while(k<n)
{
for(int j=1;j<=n;j++)//分配队伍
{
if(b[j].size()<a[j])
{
b[j].push_back(i);
if(k==n-1)i+=2;
else i++;
}
if(b[j].size()==a[j]&&f[j]==0)//标记这个学校分派完了
{
f[j]=1;
k++;
}
}
}
for(int i=1;i<=n;i++)
{
cout<<"#"<<i<<endl;
for(int j=0;j<b[i].size();j++)
{
if(j!=0&&(j+1)%10==0)cout<<b[i][j]<<endl;
else cout<<b[i][j]<<" ";
}
}
}

7-62 倒数第N个字符串 (15分)

用题目给的例子,三个字符组成的字符串

aaa...aaz26

aba...abz26

aaa...azz26*26

baa...baz26

bba...bbz26

baa...bzz26*26

...

zaa...zaz26

zba...zbz26

zya...zyz26

zaa...zzz26*26

一共有26*26*26种

可以想象为26进制数

int main()
{
speed_up;
int l,n;
cin>>l>>n;
ll p=1;
for(int i=0;i<l;i++)
{
p*=26;
}
n=p-n;//先转换成正序
char c[7];//定义一个字符数组
int i=0;
while(l--)//注意这里不能写while(n>0)
{
int x=n%26;
c[i++]=x+'a';
//n-=x;这个加不加都行
n/=26;
}
for(int j=i-1;j>=0;j--)//逆序输出
{
cout<<c[j];
}
cout<<endl;
}

posted @ 2020-11-22 18:44  SyrupWRLD  阅读(220)  评论(0)    收藏  举报