华一7.7号水题赛小结

背景

7.7刚考完试,成绩很不理想,测试之前觉得自己都可以AK,结果一共5道题,满分500分,只得300分,所以来写一个小结

正文

1、 求最大质子问题。
编一程序,输入正整数 N(N 在 2~2*10
9之间), 求它的最大质因子(包括它本身)。 输入文件:只有一行,就是正整数 N, 输出文件:只有一行,就是所求的最大质因子。 输入输出样例:
输入:7 输入:9
输出:7 输出:3
非常明显的水题,于是考试时只花3分钟写完此题,但是,到了考试要结束的时候,猛然发觉自己的解法有问题!!!
正解应该是:
把i从2枚举到sqrt(n),然后一个个的除,但是,关键一句话,应该要写while,我却这样写了:

if (n%i==0)

其实应该这样写

while (n%i)

于是,我还十分意外的得了60分,不得不说,数据是真的水
贴一波std

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int n,n1,ans,i;
void chu()
{
	while (!(n1%i)) {n1=n1/i; ans=i;}
}
int main()
{
	freopen("num.in","r",stdin);
	freopen("num.out","w",stdout);
	cin>>n; n1=n;
	for (i=2;i<=sqrt(n);i++) chu();
	cout<<max(ans,n1);
	return 0;
}

2、 求数字的乘积根问题。
一个正整数的数字的乘积 N 的定义是:这个整数中非零数字的乘积。例如,整数 999 的数字乘积为 9
×9×9,即 729;729 的数字乘积为 7×2×9, 即 126;126 的数字乘积为 1×2×6,即 12;12 的数字乘
积为 1×2,即 2。一个正整数的数字乘积根 N 是这样得到的:反复取该整数的非零数字乘积, 直到得到
一位数字为止。例如,在上面的例子中数字的乘积根是 2。
编一个程序,输入一个正整数(长度不超过 200 位数字), 输出计算其数字乘积根的每一步结果。 输入文件:只有一行,就是正整数 N, 输出文件:若干行,就是 N 每一步乘积根的结果。 输入输出样例:
输入:7 输入:126
输出:7 输出:12
       2

十分裸的高精乘低精,于是题还没读完的我,又开始飘了,所以,理所当然得,我漏掉了几句话(即加黑字),然后,这道题就没有悬念的爆零了
std:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int a[330],b[330];
char s[330];
int s1,k;
int main()
{
	freopen("root.in","r",stdin);
	freopen("root.out","w",stdout);
	gets(s); s1=strlen(s);
	for (int i=1;i<=s1;i++) a[i]=s[i-1]-'0';
	while (s1>1)
	{
		memset(b,0,sizeof(b));
		k=1; b[k]=1;
		for (int i=1;i<=s1;i++)
		{
			if (!a[i]) continue;
			for (int j=1;j<=k;j++) b[j]*=a[i];
			for (int j=1;j<=k;j++) b[j+1]+=b[j]/10,b[j]%=10;
			if (b[k+1]) k++;
		} 
		for (int i=k;i>=1;i--) a[i]=b[i],cout<<b[i];
		cout<<endl;
		s1=k;
	}
	return 0;
}

3、 文本处理问题。
编写程序,读入一行文本,文本是一个长度不超过255的英文句子,单词之间有一个或一个以
上的空格,输出:
①统计单词的个数;
②一个对应的英文句子,其中原句中的所有小写字母均转换成大写字母,大写字母转换成小写字母;
③删除所有空格符后对应的句子。 输入文件:只有一行,就是一个英文句子, 输出文件:有三行,第一行单词的个数,第二行,转换了大小写的英文句子,第三行删除空格的句
子。输入输出样例:
输入:Who are you?
输出:3
   wHO ARE YOU?
   Whoareyou?

emmm,考试时判断单词数出现了玄学问题,扣了20分,至今未跳出,弃疗
std:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
char s[265];
int p,ans,s1;
void qiu()
{
	p=0;  ans=0;
	for (int i=0;i<=s1-1;i++)
	{
		if (s[i]==' ') p=0;
		else 
		{
			if (p==0) ans++;
			p=1;
		}
	}
	cout<<ans<<endl;
}
void zhuan()
{
	for (int i=0;i<=s1-1;i++)
	{
		if (s[i]>='a'&&s[i]<='z') cout<<char(s[i]-'a'+'A');
		else if (s[i]>='A'&&s[i]<='Z') cout<<char(s[i]-'A'+'a');
		else cout<<s[i];
	}
	cout<<endl;
}
void shan()
{
	for (int i=0;i<=s1-1;i++)
		if (s[i]!=' ') cout<<s[i];
}
int main()
{
	freopen("words.in","r",stdin);
	freopen("words.out","w",stdout);
	gets(s); s1=strlen(s);
	qiu();
	zhuan();
	shan();
	return 0;
}

4、 求商问题。
编一个程序求 A/B 的值,要求精确到小数点后 N 位(N<=80 的自然数),并且 A<B,A 和 B 是整型
(int)范围,不足 N 位的用“0”补齐。例如:精确到小数点后 9 位:6/7=0.857142857。输入 A、B、N,
求 A/B。输入文件:只有一行,就是 A,B,N, 输出文件:只有一行,就是 A/B 的结果。 输入输出样例:
输入:6 7 9
输出:0.857142857

也是一道高精模板题,不过是高精度的低精除低精,还行?不过,要注意,被除数乘10时要记得开long long,因为这个问题,我又丢了40分
std

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
long long a,b,n;
int main()
{
	freopen("shang.in","r",stdin);
	freopen("shang.out","w",stdout);
	cin>>a>>b>>n;
 	if ((a<0)+(b<0)==1) cout<<'-';
	a=abs(a); b=abs(b); 
	if (n==0) {cout<<a/b; return 0;}
	cout<<a/b; cout<<'.';
	a=a%b;
	for (int i=1;i<=n;i++)
	{
		a=a*10;
		cout<<a/b; 
		a=a%b;
	}
	return 0;
}

五、约瑟夫环问题
编号为 1、2、3、…、n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。从指定编
号为 1 的人开始,按顺时针方向自 1 开始报数,报到指定值 m 时停止报数,报第 m 的人出列,并将他的密
码作为新的 m 值,从他在顺时针方向的下一个人开始,重新从 1 开始报数,如此类推,直至所有的人全部
出列为止。输入 n(n<=1000),m(m<=30000)及密码值(<=10000),试设计一个程序求出列顺序。 输入文件:有二行,第一行,N 和 M,第二行,N 个小于等于 10000 的密码值,中间用空格隔开。 输出文件:只有一行,就是出列的顺序,编号间以空格隔开。 输入输出样例:
输入:6 7
1 4 2 8 5 7
输出:1 2 6 3 5 4

简单的队列模拟操作,没什么好说的,不过std好像是纯模拟

std

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int k,t,s,n,m;
int a[1010],b[1010];
int main()
{
	freopen("jophs.in","r",stdin);
	freopen("jophs.out","w",stdout);
    cin>>n>>m;
    for (int i=1;i<=n;i++) cin>>a[i];
	k=0; t=0; s=0; m=m%n; if (m==0) m=n;
	while (s<n)
	{
		t++;   
		if (t==n+1) t=1;
		if (!b[t])
		{
			k++;
			if (k==m) 
			{
				b[t]=1; 
				cout<<t<<' '; 
				k=0; s++; 
				if (s==n) break;
				m=a[t]; m=m%(n-s);
				if (m==0) m=n-s;
			}
		}
	}
	return 0;
}

总之,最好以后还是不要飘了,要不然竞赛班都进不了了qwq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值