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