2021-2022-2-第6次单元练习后记//Pintia
一个简单的说明
主要以记录题目,分享源码为主
顺带记录做题心路历程
太久没有做题了,手生了,难免犯一些低级错误
最后,顺便对我的后续练习起到一个规划的作用
7-1 寻找250 (10 分)
题面
对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5
C++源码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAXN 1001
int in[MAXN],ins,q;
int main(){
memset(in,0,sizeof(in));
// freopen("a.txt","r",stdin);
ins=1;
while(scanf("%d",&q)!=EOF){
if(!in[q]&&q>0)in[q]=ins;
++ins;
}
printf("%d",in[250]);
return 0;
}//经典EOF,差点忘了怎么写,freopen很久没写,也快忘了,绝,一个部分的桶排序
7-2 求整数的位数及各位数字之和 (10 分)
题面
对于给定的非负整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个非负整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
在这里给出一组输入。例如:
321
输出样例:
在这里给出相应的输出。例如:
3 6
C++源码
#include<cstdio>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int n,sum,couts;
int main(){
sum=couts=0;
n=read();
while(n>=10){
sum+=(n%10);
++couts;
n/=10;
}
++couts;
sum+=n;
printf("%d %d",couts,sum);
return 0;
}
7-3 猜数字游戏 (10 分)
题面
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
C++源码
#include<cstdio>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int num,tims,temp,nows;
int main(){
nows=0;
num=read(),tims=read();
while(1){
++nows;
scanf("%d",&temp);
if(temp<0||nows>tims){
printf("Game Over\n");
break;
}
if(temp==num&&nows==1){
printf("Bingo!\n");
break;
}
if(temp==num&&nows<=3&&nows>1){
printf("Lucky You!\n");
break;
}
if(temp==num&&nows>3&&nows<=tims){
printf("Good Guess!\n");
break;
}
if(temp>num)printf("Too big\n");
if(temp<num)printf("Too small\n");
}
return 0;
}
7-4 打印九九口诀表 (10 分)
题面
下面是一个完整的下三角九九口诀表:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
16=6 26=12 36=18 46=24 56=30 66=36
17=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 99=81
本题要求对任意给定的一位正整数N,输出从11到N*N的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
C++源码
#include<cstdio>
int n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j)
printf("%dx%d=%-4d",j,i,i*j);//我是傻逼,第一次想当然写的是x
putchar('\n');
}
return 0;
}
7-5 求特殊方程的正整数解 (10 分)
题面
本题要求对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution
C++源码
#include<cstdio>
#include<cmath>
int N,sn,couts;
int main(){
couts=0;
scanf("%d",&N);
sn=abs(sqrt(N));
for(int i=1;i<=sn;++i)
for(int j=1;j<=sn;++j){
if(i*i+j*j==N&&i<=j)printf("%d %d\n",i,j),couts++;
}
if(!couts)printf("No Solution");//完全忘记了这个,立下了9点前写完的flag,急了急了
return 0;
}
7-6 统计素数并求和 (10 分)
题面
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
C++源码
//复习欧拉筛
#include<cstdio>
#include<cstring>
#define MAXN 1001
bool vis[MAXN];
int prime[MAXN],m,n,cnt,sum,couts;
int main(){
cnt=sum=couts=0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&m,&n);
for(int i=2;i<=n;++i){
if(!vis[i]){
prime[++cnt]=i;
vis[i]=true;
}
for(int j=1;j<=cnt;++j){
if(i*prime[j]>n)break;
vis[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
for(int i=1;i<=cnt;++i)
if(prime[i]>=m&&prime[i]<=n)sum+=prime[i],++couts;
printf("%d %d",couts,sum);
return 0;
}
蛮好的,又复习一遍欧拉线性筛
7-7 水仙花数 (10 分)
题面
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1 3+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
C++源码
#include<cstdio>
int N,temp;
int cous[]={0,9,99,999,9999,99999,999999,9999999};
int haj[]={0,1,10,100,1000,10000,100000,1000000};
int pows(int a,int b){
//复习快速幂
int res=1;
while(b>0){
if(b&1)res=res*a;
a=a*a;
b>>=1;
}
return res;
}
int main(){
int sum;
scanf("%d",&N);
for(int i=haj[N];i<=cous[N];++i){
temp=i;
sum=0;
while(temp>10){
sum+=pows(temp%10,N);
temp/=10;
}
sum+=pows(temp,N);
if(sum==i)printf("%d\n",i);
}
return 0;
}
本次练习的反思
前两天玩嗨了,今天起晚了
但是今天写的很爽就是
关于源码中read()函数的说明
read()函数为自行定义的一个快速读入整数的函数,不熟悉快读的朋友可以自行改为scanf()语句。