天梯赛L1(c//c++)星炎

L1-002 打印沙漏 (20分)
关键在于如何计算沙漏的总高度。假设沙漏总共有 H 行(根据题目要求,H 一定是奇数),我们观察 H+12 行到 H 行(共 H+12 行),符号个数为 1+3+5+⋯+H=(H+12)2 个,整个图形的符号个数即为 2(H+12)2−1=n 个,那么 H=2n+12−−−√−1。我们需要找到一定的 N 下最大的 H 值,即 Hmax=2⌊N+12−−−−√⌋−1,之后按要求输出即可。
Ps.

  1. 每行的 * 后没有多余空格
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;

int main(void)
{
    
    
	int n,i;
	char p;
	scanf("%d %c",&n,&p);
	int h=sqrt((n+1)/2);
	for(i=h;i>=1;i--)
    {
    
    
         for(int j=1;j<=h-i;j++)cout<<' ';
        for(int j=1;j<=2*i-1;j++)cout<<p;
        cout<<endl;
    }
    for(i=2;i<=h;i++)
    {
    
    

         for(int j=1;j<=h-i;j++)cout<<' ';
        for(int j=1;j<=2*i-1;j++)cout<<p;
        cout<<endl;
    }
    printf("%d",n-(h*h*2-1));
}

L1-003 个位数统计 (15分)
注意 1000 位的正整数 N不能用int, double

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;

int main(void)
{
    
    
	int a[10]={
    
    0},i;
	char n;

	while(scanf("%c",&n)!=EOF)
    {
    
    
        a[n-'0']++;
    }
    for(i=0;i<10;i++)
    {
    
    

        if(a[i]!=0)
        printf("%d:%d\n",i,a[i]);
    }
}

L1-005 考试座位号 (15分)

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
struct node
{
    
    
    char s[17];
    int shi;
    int kao;
}people[1001];
int main(void)
{
    
    
	int n,i,b[1001],j;
	cin>>n;
	for(i=0;i<n;i++)
	cin>>people[i].s>>people[i].shi>>people[i].kao;
	int m;
	cin>>m;
	for(j=0;j<m;j++)
    {
    
    
        scanf("%d",&b[j]);
        for(i=0;i<n;i++)
    {
    
    
        if(b[j]==people[i].shi)
        cout<<people[i].s<<" "<<people[i].kao<<endl;
    }
    }

}

L1-006 连续因子 (20分)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll sum, start;//最长连续因子的个数,开始时的因子
int main()
{
    
    
	ll n;
	cin >> n;
	for (ll i = 2; i*i <= n; i++)//只需遍历到根号n即可,因为在根号n到n之间没有连续因子,除非为素数为本身
	{
    
    
		if (n%i != 0)//不是因子就不需要判
			continue;
		ll j = i;	
		ll t = n;	//临时变量代替n,否则n的值会改变
		ll num = 0;//临时记录最长连续因子个数
		while (t%j == 0)//暴力连续因子
		{
    
    
			t /= j;
			num++;
			j++;
		}
		if (sum < num)//更新最优值
		{
    
    
			sum = num;
			start = i;
		}
	}
	if (sum == 0)//素数
		cout << "1" << endl << n << endl;
	else
	{
    
    
		cout << sum << endl;
		for (int i = 0; i < sum; i++)
		{
    
    
			if (i == sum - 1)
				cout << start + i << endl;
			else
				cout  << start + i<<"*";
		}
	}
 
	return 0;
}

L1-007 念数字 (10分)

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    int n;
    scanf("%d",&n);
    if(n<0)
    {
    
    
         printf("fu ");
         n=-n;
    }
   int t=n,mask=1;
    while(t>9)
    {
    
    
        t/=10;
        mask*=10;
    }
 char *s[] = {
    
    "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    int d;
    while(mask>0)
    {
    
    
        d=n/mask;
        printf("%s",s[d]);
        if(mask>9)
        {
    
    
            printf(" ");
        }
        n%=mask;
        mask/=10;
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/a675891/article/details/108540885