PTA团体程序设计天梯赛-练习集6-10题

L1-006 连续因子【这一题好难啊】

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7
#include <iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
	 int n;
	cin>>n;//输入
	/*
	//思路:【1】用一个数组装所有因子(注意判断条件用sqrt(n)+1
	[2]最长的连续因子的乘积和要是n的因子
	【3】记录最长连续因子的长度 和在数组中的位置,方便打印
	*/
	//1.用for循环找到所有因子
	int a[100];//存放因子的数组
	int p=0;//数组的序号,下标
	for(int i=2;i<=sqrt(n)+1;i++){
		if(n%i==0)a[p++]=i;
	}
	if(p==0)a[p++]=n;//判断为素数的情况
	//2.判断每一个因子的连续因子序列,最长的连续因子序列的乘积要是n的因子
	int product=1;//因子的乘积
	int x=1;//记录因子的个数
	int max=1;//记录最长的连续因子数
	int y=0;//记录最长连续因子序列在数组a的第一个数序号
	for(int i=0;i<p;i++){
		product=a[i];
		x=1;
		for(int j=i+1;j<p;j++){
			//先判断是否连续
			if(a[j-1]+1==a[j]){
				product*=a[j];
				if(n%product==0){
					x++;
					if(x>max){
						max=x;
						y=i;
					}
				}else j=p;
			}else j=p;
		}
	}
	cout<<max<<endl;
	for(int i=y;i<y+max;i++){
		if(i!=y+max-1)cout<<a[i]<<"*";
		else cout<<a[i];
	}
		return 0;
}

 L1-007 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:

输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

-600

输出样例:

fu liu ling ling

 

#include<stdio.h>
#include<string.h>
int main() 
{
char a[10][10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; //用字符型数组和数字建立联系 
char shuzi[1000];
gets(shuzi);
int m = strlen(shuzi);
for(int i  = 0; i <= m - 1; i++)
{
if(shuzi[i] == '-') printf("fu");
else printf("%s",a[shuzi[i] - 48]);
if(i != m - 1) printf(" ");
}
}

L1-008 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8

输出样例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30
#include<stdio.h>
int main(void)
{
    int a,b,i,count,sum;
    scanf("%d %d",&a,&b);
    count = 0;
    sum = 0 ;
    for(i=a;i<=b;i++){
        sum +=  i;
        printf("%5d",i);
        count++;
        //为什么还要保证i!=b呢
        if(count%5==0&&i!=b){
            printf("\n");
        }
    }
    printf("\n");
    printf("Sum = %d\n",sum);
   return 0;
}

 L1-009 N个数求和【这一题我更是不会。】

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24
#include <stdio.h>

long long int gcd(long long int a,long long int b)
//这个地方还是和之前一样,求一个最大公约数,去化简分数(辗转相除法)
{
	long long int j;
	if(a>=b)
	{
		while(b!=0)
		{
			j = b;
			b = a%b;
			a = j;
		}	
		return a;
	}
	else if(a<b)
	{
		while(a!=0)
		{
			j = a;
			a = b%a;
			b = j;
		}		return b;
	}
}

int main()
{
    int N,i,j;
    scanf("%d",&N);//输入分数的个数
    long long int num1,num2,sum1 = 0,sum2 = 1;
    for(i = 0;i<N;i++)
    {
        scanf("%lld/%lld",&num1,&num2);//输入分数
        sum1 *= num2;
        sum1 += num1 * sum2; 
        sum2 *= num2;
        //做两个分数的加法,先获取分母的值,然后分母乘分子的值直接相交求和,分母只做乘法
        
        j = gcd(sum1,sum2);//求最大公约数
        sum1 /= j;
        sum2 /= j;//化简
    }
    if(sum1%sum2 == 0)printf("%lld",sum1/sum2);//整数
	else if(sum1/sum2 == 0)printf("%lld/%lld",sum1%sum2,sum2);//纯分数
	else printf("%lld %lld/%lld",sum1/sum2,sum1%sum2,sum2);//整数分数混合
}

 L1-010 比较大小

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

输出样例:

2->4->8
#include<stdio.h>
int main(void)
{
    int a[3] ,i,j,t;
    for(i=0;i<3;i++){
        scanf("%d",&a[i]);
    }
    for(i=1;i<3;i++){
        for(j=0;j<3-i;j++){
            if(a[j]>a[j+1]){
              t= a[j];a[j]=a[j+1];a[j+1] = t;  }
        }
    }
    for(i=0;i<3;i++){
        if(i!=0)  printf("->");
        printf("%d",a[i]);
    }
    return 0;
}

 

### 关于 PTA 团体程序设计天梯赛 L1 练习的解答与资源 PTA(Programming Teaching Assistant)是一个在线编程评测平台,广泛用于高校的教学和竞赛训练。对于团体程序设计天梯赛中的L1题目,通常涉及基础算法数据结构以及简单的逻辑推理[^1]。 以下是针对此类问的一个通用解决方案框架: #### 输入处理 假设输入的第一行为列宽 \( N \) (\( N < 100 \)),第二行为待排版的字符串(长度不超过1000)。可以通过标准输入读取这些数据并存储到变量中[^2]。 ```python n = int(input()) # 列宽 text = input() # 待排版字符串 ``` #### 排版实现 为了完成古风排版功能,可以按照以下方式分割字符串并将结果按指定宽度打印出来。这里提供了一个基于Python的语言示例。 ```python def format_text(text, n): result = [] while len(text) > n: line = text[:n] text = text[n:] # 如果最后一字为空格,则删除该空格 if line[-1].isspace(): line = line.rstrip() text = ' ' + text result.append(line) if text: # 添加剩余部分 result.append(text) return result formatted_lines = format_text(text, n) for line in formatted_lines: print(line) ``` 此函数`format_text`接受两个参数:原始文本 `text` 和每行的最大字符数 `n` 。它会逐步截取字符串直到其长度小于等于给定列宽为止,并妥善处理边界情况如单词间多余空白等问。 #### 输出展示 最终输出将是重新格式化后的多行文字串列表形式,其中每一项代表新的一行内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值