PTA 天梯赛 L1

L1-002 打印沙漏

细节:就是在  (i>j&&i+j<r+1) 这个区间里才有空格,然后就是 for 循环   for(r=1; ;r+=2)  条件不满足之后还会再+2;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
    int n;
    char c;
    scanf("%d %c",&n,&c);
//    int r=1,sum=1;
//    for(r=3;sum<=n ;r+=2){
//    sum+=r*2;
//    }
//    sum-=r*2;
//    r-=2;
    int r=1,sum=0;
    for(r=1; ;r+=2){
    if(r==1)sum+=r;
    else sum+=r<<1;
    if(sum>n)break;
    }
    sum-=r<<1;
    r-=2;
//    cout<<sum<<" "<<r<<endl;    
    for(int i=1;i<=r;i++){
    for(int j=1;j<=r;j++){
    if(i<=j&&i+j<=r+1||i>=j&&i+j>=r+1)cout<<c;
    else if(i>j&&i+j<r+1) cout<<" ";
    
    }
    cout<<endl;
    }
    cout<<n-sum<<endl;
    return 0;    
}
View Code

L1-003 

搞个map即可,然后注意map只能从first  映射到second

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
    string s;
    cin>>s;
    map<int,int>mp;
    int len=s.size();
    for(int i=0;i<len;i++){
    mp[s[i]-'0']++;
    }
    map<int,int>::iterator it;
    for(it=mp.begin();it!=mp.end();it++){
    cout<<it->fi<<":"<<it->se<<endl;
    }
    return 0;    
}
View Code

L1-006 连续因子

解法:就是你把他的全部因子求出来,然后去枚举每一个因子的最大连续次数,最后取一个最大值即可;

然后如果n是素数,输出n即可;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
    int n;
    cin>>n;
    vector<int>v;
    int ans,max=-1;
    for(int i=2;i<=sqrt(n)+1;i++){
    if(n%i==0)v.pb(i);
    }
    int len=v.size();
    for(int i=0;i<len;i++){
    int sum=v[i],cnt=0;
    for(int j=v[i]+1; ;j++){
    sum*=j;
    if(n%sum!=0)break;
    cnt++;
    }
    if(cnt>max){
    ans=v[i];
    max=cnt;
    }
    }
    if(len==0)cout<<1<<endl<<n<<endl;
    else {
    cout<<max+1<<endl;
    for(int i=0;i<=max;i++){
    if(i)cout<<"*";
    cout<<ans+i;    
    }
    cout<<endl;
    }
    return 0;    
}
View Code

L1-008 求整数段和

细节,最后不要打出两个换行即可;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){

    int a,b;
    cin>>a>>b;
    ll sum=0;
    int i,j;
    for(i=a,j=1;i<=b;j++,i++){
    printf("%5d",i);
    sum+=i;
    if(j%5==0)printf("\n");
    }
    if((j-1)%5!=0)printf("\n");
    printf("Sum = %d",sum);
//    cout<<"Sum = "<<sum<<endl;
    return 0;    

}
View Code

未完待续;

猜你喜欢

转载自www.cnblogs.com/littlerita/p/12310992.html