题意:给n,处理 n-1 次。每一次处理要把上次的处理的结果添加到这一次的末尾,再在整个序列的中间插入一个之前没有出现过的正整数,问处理 n-1 次后,第 k 个位置的数字是什么。
题解:由题意可知
n=1时 1
n=2时 1 2 1
n=3时 1 2 1 3 1 2 1
n=4时 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
n=5时 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
. . . . . . . . . . . . . . . . . . . . . . . .
*******************************************************************************
由上面可以看出
1的位置为 1 3 5 7 9 . . . . . 即20*(2m+1)
2的位置为 2 6 10 14 18 . . . . . 即21*(2m+1)
3的位置为 4 12 20 28 . . . . . . 即22*(2m+1)
. . . . . . . . . . . . . . . . . . . . . . . . .
*********************************************************************************
由此可知k的质因数中有几个2,那这个位置上的数就是2的个数+1
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; int main(){ ll n,k; cin>>n>>k; ll sum=0; while(1){ if(k%2==0){ sum++; k=k/2; }else{ break; } } cout<<sum+1<<endl; return 0; }
题意:给n,求满足2/n = 1/x + 1/y + 1/z的三个数
题解:n=1时无解其他情况x=n,y=n+1,则z=n*(n+1)
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; int main(){ ll n,k; cin>>n>>k; ll sum=0; while(1){ if(k%2==0){ sum++; k=k/2; }else{ break; } } cout<<sum+1<<endl; return 0; }
题意:一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入在一行中给出一个正整数 N(1)。
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
题解:从2到sqrt(n)枚举,对每个枚举的因子判断它的连续因子的长度,并记录第一个因子。最后按照记录的第一个因子和长度输出
#include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; int main(){ ll m,n,flag; cin>>n; m=n; ll sum=0,maxx=0; for(ll i=2;i*i<=n;i++){ sum=0; m=n; ll j=i; while(m%j==0){ m=m/j; j++; sum++; } if(sum>maxx){ maxx=sum; flag=i; } } if(maxx==0){ cout<<1<<endl; cout<<n<<endl; }else{ cout<<maxx<<endl; for(int i=1;i<=maxx;i++){ if(i!=maxx){ cout<<flag++<<"*"; }else{ cout<<flag++<<endl; } } } return 0; }
题意:中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入在第一行给出一个正整数N(<),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
题解:第一列要初始化为空格,其他按要求赋给二维字符数组
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int main(){ int n,k=0,t=0; cin>>n; getchar(); string s; char a[100][10010]; getline(cin,s); if(s.length()%n!=0){ t=s.length()/n+1; }else{ t=s.length()/n; } for(int i=0;i<n;i++){ a[i][0]=‘ ‘; } for(int i=t-1;i>=0;i--){ for(int j=0;j<n;j++){ a[j][i]=s[k++]; if(k==s.length()) break; } } for(int i=0;i<n;i++){ for(int j=0;j<t;j++){ cout<<a[i][j]; } cout<<endl; } return 0; }
QFNU-ACM 2020.10.30 Trating+2020.11.01天梯赛练习*4
原文:https://www.cnblogs.com/yy0826/p/13946090.html