華一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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章