2021-2022-2-第6次单元练习后记

一个简单的说明

主要以记录题目,分享源码为主
顺带记录做题心路历程
太久没有做题了,手生了,难免犯一些低级错误
最后,顺便对我的后续练习起到一个规划的作用

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
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
1
6=6 26=12 36=18 46=24 56=30 66=36
1
7=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,输出从1
1到N*N的部分口诀表。

输入格式:

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

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

11=1
1
2=2 22=4
1
3=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()语句。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值