背景
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