团体程序设计天梯赛练习题L1_part 2(6~10)

前言:

1.这是L1的6~10,5题合一篇,为了节省空间,就不放题目图片了

2.题目和图片都来源于拼题A:https://pintia.cn,侵删

3.预计L1部分解释会比较少,之后写L2、L3的解释的话会详细一点


L1-006 连续因子 (20 分) 

 Notice:

题意稍微有点绕

相当于是在给定数的 所有因子里 找出最长的 连续数字串,如果有多个连续数字串的长度 都是最大的,输出数字较小的那一组

解题的话也就是给定数是素数的话直接输出,不是素数的话就暴力查找

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//素数判断 
bool prim(ll x)
{
	for(int i = 2; i <= sqrt(x); i++)
	{
		if(x % i == 0) return false;
	}
	return true;
}
int main(void)
{
	ll n;
	cin >>n;
	//是素数输出1和其本身 
	if(prim(n)){
		cout <<1 <<endl;
		cout <<n;
		return 0;
	}
	//不是素数暴力查找 
	ll sum, maxl = -1, startl;
	for(ll i = 2; i <= sqrt(n); i++){
		sum = 1;
		for(int j = i; j*sum <= n; j++){
			sum *= j;
			//找到连续因子串并更新最大长度和起始数字 
			if(n%sum==0 && j-i+1 > maxl){
				maxl = j-i+1;
				startl = i;
			}
		}
	}
	cout <<maxl <<endl;
	for(int i = startl; i < startl + maxl; i++){
		cout <<i;
		if(i < startl + maxl - 1) cout <<"*";
	}
		
    return 0;
}


L1-007 念数字 (10 分)

Notice:

map映射,且输出结果不能多空格

#include <bits/stdc++.h>
using namespace std;
map<int, string>mp;
int main(void)
{
    string s;
    cin >>s;
    mp[0] ="ling";  mp[1] = "yi";
    mp[2] = "er";   mp[3] = "san";
    mp[4] = "si";   mp[5] = "wu";
    mp[6] = "liu";  mp[7] = "qi";
    mp[8] = "ba";   mp[9] = "jiu";
    for(int i = 0; s[i]; i++){
        if(s[i] == '-') cout <<"fu" <<" ";
        else{
            cout <<mp[s[i] - '0'];
            if(s[i+1]) cout <<" ";
        } 
    }
    return 0;
}

L1-008 求整数段和 (10 分)

#include <bits/stdc++.h>
using namespace std;
int st, en;
int main(void)
{
    int cnt = 0, sum = 0;
    cin >>st >>en;
    for(int i = st; i <= en; i++){
        sum += i; cnt++;
        printf("%5d", i);
        if(cnt % 5 == 0 || i == en) cout <<endl;
    }
    cout <<"Sum = " <<sum;
    return 0;
}

L1-009 N个数求和 (20 分)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll gcd(ll a, ll b)
{ return b == 0 ? a : gcd(b, a % b); }
int main(void)
{
    ll n, zi, mu;
    cin >>n;
    for(int i = 1;i <= n; i++){
        ll z, m; char x;
        cin >>z >>x >>m;
        
        if(i != 1){
            //最小公倍数通分
            ll temp = mu * m / gcd(m , mu);
            //修改分子加和
            z = z * (temp / m);
            zi = zi * (temp / mu);
            zi += z;
            //分母
            m = mu = temp;
        }
        else
            zi = z, mu = m;
    }
    //分子分母化简
    while(gcd(zi, mu) != 1){
        ll num = gcd(zi, mu);
        zi /= num; mu /= num;
    }
    //输出
    if(zi % mu == 0)
        cout <<zi/mu;
    else{
        if(zi > mu){
            cout <<zi/mu <<" ";
            zi %= mu;
            cout <<zi <<"/" <<mu;
        }
        else
            cout <<zi <<"/" <<mu;
    }
    return 0;
}

L1-010 比较大小 (10 分) 

#include <bits/stdc++.h>
using namespace std;
int main(void)
{
    int a[3];
    cin >>a[0] >>a[1] >>a[2];
    sort(a, a + 3);
    cout <<a[0] <<"->"<<a[1] <<"->" <<a[2];
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UmVfX1BvaW50

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值