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.
- 每行的 * 后没有多余空格
#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]);
}
}
#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;
}
}
}
#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;
}
#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;
}