NOI題庫答案(1.5 編程基礎之循環控制)(21—45題)

NOI網址:http://noi.openjudge.cn/

目錄

21:角谷猜想

22:津津的儲蓄計劃

23:藥房管理

24:正常血壓

25:求特殊自然數

26:統計滿足條件的4位數個數

27:級數求和

28:分離整數的各個數位

29:數字反轉

30:含k個3的數

31:開關燈

32:求分數序列和

33:計算分數加減表達式的值

34:求階乘的和

35:求出e的值

36:計算多項式的值

37:僱傭兵

38:計算多項式的導函數

39:與7無關的數

40:數1的個數

41:數字統計

42:畫矩形

43:質因數分解

44:第n小的質數

45:金幣


21:角谷猜想

總時間限制: 1000ms     

內存限制: 65536kB

描述

所謂角谷猜想,是指對於任意一個正整數,如果是奇數,則乘3加1,如果是偶數,則除以2,得到的結果再按照上述規則重複處理,最終總能夠得到1。如,假定初始整數爲5,計算過程分別爲16、8、4、2、1。
程序要求輸入一個整數,將經過處理得到1的過程輸出來。

輸入

一個正整數N(N <= 2,000,000)

輸出

從輸入整數到1的步驟,每一步爲一行,每一部中描述計算過程。最後一行輸出"End"。如果輸入爲1,直接輸出"End"。

樣例輸入

5

樣例輸出

5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
#include <iostream>
using namespace std;
int main()
{
	long long n;
	cin>>n;
	if(n==1)
		cout<<"End";
	else
	{
		while(n!=1)
		{
			if(n%2==1)
			{
				cout<<n<<"*3+1="<<3*n+1<<endl;
				n=3*n+1;
			}
			else
			{
				cout<<n<<"/2="<<n/2<<endl;
				n/=2;
			}
		}
		cout<<"End";
	}
	return 0;
}

22:津津的儲蓄計劃

總時間限制: 1000ms

內存限制: 65536kB

描述

津津的零花錢一直都是自己管理。每個月的月初媽媽給津津300元錢,津津會預算這個月的花銷,並且總能做到實際花銷和預算的相同。

爲了讓津津學習如何儲蓄,媽媽提出,津津可以隨時把整百的錢存在她那裏,到了年末她會加上20%還給津津。因此津津制定了一個儲蓄計劃:每個月的月初,在得到媽媽給的零花錢後,如果她預計到這個月的月末手中還會有多於100元或恰好100元,她就會把整百的錢存在媽媽那裏,剩餘的錢留在自己手中。

例如11月初津津手中還有83元,媽媽給了津津300元。津津預計11月的花銷是180元,那麼她就會在媽媽那裏存200元,自己留下183元。到了11月月末,津津手中會剩下3元錢。

津津發現這個儲蓄計劃的主要風險是,存在媽媽那裏的錢在年末之前不能取出。有可能在某個月的月初,津津手中的錢加上這個月媽媽給的錢,不夠這個月的原定預算。如果出現這種情況,津津將不得不在這個月省吃儉用,壓縮預算。

現在請你根據2004年1月到12月每個月津津的預算,判斷會不會出現這種情況。如果不會,計算到2004年年末,媽媽將津津平常存的錢加上20%還給津津之後,津津手中會有多少錢。

輸入

包括12行數據,每行包含一個小於350的非負整數,分別表示1月到12月津津的預算。

輸出

包括一行,這一行只包含一個整數。如果儲蓄計劃實施過程中出現某個月錢不夠用的情況,輸出-X,X表示出現這種情況的第一個月;否則輸出到2004年年末津津手中會有多少錢。

樣例輸入

樣例 #1:
290
230
280
200
300
170
340
50 
90 
80 
200
60

樣例 #2:
290 
230 
280 
200 
300 
170 
330 
50 
90 
80 
200 
60

樣例輸出

樣例 #1:
-7

樣例 #2:
1580
#include <iostream>
using namespace std;
int main()
{
	int i,sum1=0;
	int a[15];
	double sum2=0;
	for(i=1;i<=12;i++)
		cin>>a[i];
	for(i=1;i<=12;i++)
	{
		sum1+=300;
		if(sum1<a[i])
		{
			cout<<-i;
			break;
		}
		sum1-=a[i];
		if(sum1>100) 
		{
			sum2+=sum1/100*100;
			sum1=sum1%100;
		}
	}
	if(i==13)
		cout<<sum2*1.2+sum1;
	return 0;
}

23:藥房管理

總時間限制: 1000ms

內存限制: 65536kB

描述

   隨着信息技術的蓬勃發展,醫療信息化已經成爲醫院建設中必不可少的一部分。計算機可以很好地輔助醫院管理醫生信息、病人信息、藥品信息等海量數據,使工作人員能夠從這些機械的工作中解放出來,將更多精力投入真正的醫療過程中,從而極大地提高了醫院整體的工作效率。
    對藥品的管理是其中的一項重要內容。現在藥房的管理員希望使用計算機來幫助他管理。假設對於任意一種藥品,每天開始工作時的庫存總量已 知,並且一天之內不會通過進貨的方式增加。每天會有很多病人前來取藥,每個病人希望取走不同數量的藥品。如果病人需要的數量超過了當時的庫存量,藥房會拒 絕該病人的請求。管理員希望知道每天會有多少病人沒有取上藥。

輸入

共3行
第一行是每天開始時的藥品總量m
第二行是這一天取藥的人數n(0 < n <= 100)
第三行共有n個數,分別記錄了每個病人希望取走的藥品數量(按照時間先後的順序),兩數之間以空格分隔

輸出

只有1行,爲這一天沒有取上藥品的人數。

樣例輸入

30
6
10 5 20 6 7 8

樣例輸出

2
#include <iostream>
using namespace std;
int main()
{
	int m,n,i,sum=0;
	int a[105];
	cin>>m>>n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n;i++)
	{
		
		if(m>=a[i])
			m-=a[i];
		else
		{
			sum++;
			continue;
		}
	
	}
	cout<<sum;
	return 0;
}

24:正常血壓

總時間限制: 1000ms

內存限制: 65536kB

描述

監護室每小時測量一次病人的血壓,若收縮壓在90 - 140之間並且舒張壓在60 - 90之間(包含端點值)則稱之爲正常,現給出某病人若干次測量的血壓值,計算病人保持正常血壓的最長小時數。

輸入

第一行爲一個正整數n,n < 100
其後有n行,每行2個正整數,分別爲一次測量的收縮壓和舒張壓,中間以一個空格分隔。

輸出

輸出僅一行,血壓連續正常的最長小時數。

樣例輸入

4
100 80
90 50
120 60
140 90

樣例輸出

2
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
bool isNormal(int high, int low)
{
        if (high>=90&&high<=140&&low>=60&&low<=90)
            return true;
        return false;
}
int main()
{
        int n, high, low, temp=0, x=0;
        bool last=false; // 記錄上一個小時是否正常
        cin >> n;
        for (int i=0; i<n; i++){
            if (!last) temp = 0;
            cin >> high >> low;
            last = isNormal(high, low);
            if (last){
                temp++;
                if (temp > x) x = temp;
            }
        }
        cout << x << endl;
        return 0;
}

25:求特殊自然數

總時間限制: 1000ms

內存限制: 65536kB

描述

一個十進制自然數,它的七進制與九進製表示都是三位數,且七進制與九進制的三位數碼錶示順序正好相反。編程求此自然數,並輸出顯示。

輸入

無。

輸出

三行:
第一行是此自然數的十進制表示;
第二行是此自然數的七進製表示;
第三行是此自然數的九進製表示。

樣例輸入

(無)

樣例輸出

(不提供)
#include <iostream>
using namespace std;
int main()
{
    int i;
    for (i = 65; i <= 342; i++) {
        if ((i % 9 == i / 49) &&
            (i / 9 % 9 == i / 7 % 7) &&
            (i / 81 == i % 7)) {
            cout << i << endl;
            cout << i / 49 << i / 7 % 7 << i % 7 << endl;
            cout << i / 81 << i / 9 % 9 << i % 9 << endl;
            break;
        }
    }
    return 0;
}

26:統計滿足條件的4位數個數

總時間限制: 1000ms

內存限制: 65536kB

描述

給定若干個四位數,求出其中滿足以下條件的數的個數:

個位數上的數字減去千位數上的數字,再減去百位數上的數字, 再減去十位數上的數字的結果大於零。

輸入

輸入爲兩行,第一行爲四位數的個數n,第二行爲n個的四位數,數與數之間以一個空格分開。(n <= 100)

輸出

輸出爲一行,包含一個整數,表示滿足條件的四位數的個數。

樣例輸入

5
1234 1349 6119 2123 5017

樣例輸出

3
#include <iostream>
using namespace std;
int main()
{
	int n,i,sum=0;
	int b,c,d,e;
	int a[105];
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	for(i=0;i<n;i++)
	{
		e=a[i]%10;
		a[i]=a[i]/10;
		d=a[i]%10;
		a[i]=a[i]/10;
		c=a[i]%10;
		a[i]=a[i]/10;
		b=a[i]%10;
		if((e-b-c-d)>0)
			sum++;
	}
	cout<<sum;
	return 0;
}

27:級數求和

總時間限制: 1000ms

內存限制: 65536kB

描述

已知:Sn= 1+1/2+1/3+…+1/n。顯然對於任意一個整數K,當n足夠大的時候,Sn大於K。

現給出一個整數K(1<=k<=15),要求計算出一個最小的n;使得Sn>K。

輸入

一個整數K。

輸出

一個整數n。

樣例輸入

1

樣例輸出

2
#include <iostream>
using namespace std;
int main()
{
	    int k,i=1;
	    double s,sum=0;
	    cin>>k;
	    while(sum<=k)
	    {
	    	s=1.0/i;
	    	sum+=s;
		    i++;
	    }
	    cout<<i-1;
	    return 0;
}

28:分離整數的各個數位

總時間限制: 1000ms

內存限制: 65536kB

描述

給定一個整數,要求從個位開始分離出它的每一位數字。

輸入

輸入一個整數,整數在1到100000000之間。

輸出

從個位開始按照從低位到高位的順序依次輸出每一位數字。數字之間以一個空格分開。

樣例輸入

123

樣例輸出

3 2 1
#include <iostream>
using namespace std;
int main()
{
	long n;
	int i,a;
	cin>>n;
	while(n!=0)
	{
		a=n%10;
		n/=10;
		cout<<a<<" ";
	}
	return 0;
}

29:數字反轉

總時間限制: 1000ms

內存限制: 65536kB

描述

給定一個整數,請將該數各個位上數字反轉得到一個新數。新數也應滿足整數的常見形式,即除非給定的原數爲零,否則反轉後得到的新數的最高位數字不應爲零(參見樣例2)。

輸入

輸入共 1 行,一個整數N。

-1,000,000,000 ≤ N≤ 1,000,000,000。

輸出

輸出共 1 行,一個整數,表示反轉後的新數。

樣例輸入

樣例 #1:
123

樣例 #2:
-380

樣例輸出

樣例 #1:
321

樣例 #2:
-83
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
        int n;
        int s=0;
        cin>>n;
        if(n<0) 
            cout<<"-";
        n=abs(n);
        do
        {
            s=s*10+n%10;
            n/=10;
        }while(n>0);
        cout<<s;
        return 0;
}

30:含k個3的數

總時間限制: 1000ms

內存限制: 65536kB

描述

輸入兩個正整數 m 和 k,其中1 < m < 100000,1 < k < 5 ,判斷 m 能否被19整除,且恰好含有k個3,如果滿足條件,則輸出YES,否則,輸出NO。

例如,輸入:
43833 3
滿足條件,輸出YES。

如果輸入:
39331 3
儘管有3個3,但不能被19整除,也不滿足條件,應輸出NO。

輸入

m 和 k 的值,中間用單個空格間隔。

輸出

滿足條件時輸出 YES,不滿足時輸出 NO。

樣例輸入

43833 3

樣例輸出

YES
#include<iostream>
using namespace std;
int main()
{
	    int m,k,a,sum=0;
	    cin>>m>>k;
	    int p=m;
	    for(;m>0;m/=10)
	    {
		    a=m%10;
		    if(a==3)
		    	sum++;
	    }
	    if((sum==k)&&(p%19==0))
	    	cout<<"YES";
	    else
	    	cout<<"NO";
    	    return 0;
}

31:開關燈

總時間限制: 1000ms

內存限制: 65536kB

描述

假設有N盞燈(N爲不大於5000的正整數),從1到N按順序依次編號,初始時全部處於開啓狀態;有M個人(M爲不大於N的正整數)也從1到M依次編號。

第一個人(1號)將燈全部關閉,第二個人(2號)將編號爲2的倍數的燈打開,第三個人(3號)將編號爲3的倍數的燈做相反處理(即,將打開的燈關閉,將關閉的燈打開)。依照編號遞增順序,以後的人都和3號一樣,將凡是自己編號倍數的燈做相反處理。

請問:當第M個人操作之後,哪幾盞燈是關閉的,按從小到大輸出其編號,其間用逗號間隔。

輸入

輸入正整數N和M,以單個空格隔開。

輸出

順次輸出關閉的燈的編號,其間用逗號間隔。

樣例輸入

10 10

樣例輸出

1,4,9
#include <iostream>
using namespace std;
int main()
{
	int n,m,i,j,flag;
	cin>>n>>m;
	cout<<1;
	for(i=2;i<=n;i++)
	{
		flag=1;
		for(j=1;j<=m;j++)
		{
			if(i%j==0)
			{
				if(flag==0)
					flag=1;
				else
					flag=0;
			}
			else
				continue;
		}
		if(flag==0)
			cout<<","<<i; 
	}
	return 0;
} 

32:求分數序列和

總時間限制: 1000ms

內存限制: 65536kB

描述

有一個分數序列 q1/p1,q2/p2,q3/p3,q4/p4,q5/p5,.... ,其中qi+1= qi+ pi, pi+1=qi, p1= 1, q1= 2。比如這個序列前6項分別是2/1,3/2,5/3,8/5,13/8,21/13。求這個分數序列的前n項之和。

輸入

輸入有一行,包含一個正整數n(n <= 30)。

輸出

輸出有一行,包含一個浮點數,表示分數序列前n項的和,精確到小數點後4位。

樣例輸入

2

樣例輸出

3.5000
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n,i;
	double sum=0;
	double a[35],b[35],c[35];
	cin>>n;
	a[0]=2;
	b[0]=1;
	for(i=1;i<n;i++)
	{
		a[i]=a[i-1]+b[i-1];
		b[i]=a[i-1];
		c[i]=a[i]/b[i];
		sum+=c[i];
	}
	sum=sum+2.0;
	printf("%.4lf",sum);
	return 0;
} 

33:計算分數加減表達式的值

總時間限制: 1000ms

內存限制: 65536kB

描述

編寫程序,輸入n的值,求 1/1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - 1/8 + ... + (-1)n-1·1/n 的值。

輸入

輸入一個正整數n。1 <= n <= 1000。

輸出

輸出一個實數,爲表達式的值,保留到小數點後四位。

樣例輸入

2

樣例輸出

0.5000
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n,i;
	double s=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		if(i%2==0)
			s=s-1/double(i);
		else
			s=s+1/double(i);
	}
	printf("%.4lf",s);
	return 0;
}

34:求階乘的和

總時間限制: 1000ms

內存限制: 65536kB

描述

給定正整數n,求不大於n的正整數的階乘的和(即求1!+2!+3!+...+n!)

輸入

輸入有一行,包含一個正整數n(1 < n < 12)。

輸出

輸出有一行:階乘的和。

樣例輸入

5

樣例輸出

153
#include<iostream>
#include<stdio.h>
using namespace std;
int main ()
{
	int n,j,s=1,sum=0;
	cin>>n;
	for(j=1;j<=n;j++){
		s=s*j;
		sum+=s;
	}
	cout<<sum;
	return 0;
}

35:求出e的值

總時間限制: 1000ms

內存限制: 65536kB

描述

利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e 。

輸入

輸入只有一行,該行包含一個整數n(2<=n<=15),表示計算e時累加到1/n!。

輸出

輸出只有一行,該行包含計算出來的e的值,要求打印小數點後10位。

樣例輸入

10

樣例輸出

2.7182818011

提示

1、e以及n!用double表示

2、要輸出浮點數、雙精度數小數點後10位數字,可以用下面這種形式:

printf("%.10f", num);

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n;
	double i,j=1,s=0,e=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		j*=1/i;
		s+=j;
	}
	e=s+1;
	printf("%.10lf",e);
	return 0;
}

36:計算多項式的值

總時間限制: 1000ms

內存限制: 65536kB

描述

假定多項式的形式爲xn+xn-1+…+x2+x+1,請計算給定單精度浮點數x和正整數n值的情況下這個多項式的值。

輸入

輸入僅一行,包括x和n,用單個空格隔開。x在float範圍內,n <= 1000000。

輸出

輸出一個實數,即多項式的值,精確到小數點後兩位。保證最終結果在float範圍內。

樣例輸入

2.0 4

樣例輸出

31.00
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n,i;
	double x,y=0;
	cin>>x>>n;
	double s=x;
	for(i=1;i<=n;i++)
	{
		y=y+s;
		s=s*x;
	}
	y=y+1;
	printf("%.2lf",y);
	return 0;
}

37:僱傭兵

總時間限制: 1000ms

內存限制: 65536kB

描述

僱傭兵的體力最大值爲M,初始體力值爲0、戰鬥力爲N、擁有X個能量元素。

當僱傭兵的體力值恰好爲M時,纔可以參加一個爲期M天的戰鬥期,戰鬥期結束體力值將爲0。在同一個戰鬥期內,僱傭兵每連續戰鬥n天,戰鬥力就會上升1點,n爲當前戰鬥期開始時的戰鬥力。

一個戰鬥期結束後,僱傭兵需要用若干個能量元素使其體力恢復到最大值M,從而參加下一個戰鬥期。每個能量元素恢復的體力值不超過當前的戰鬥力。每個能量元素只能使用一次。

請問:僱傭兵的戰鬥力最大可以到達多少。

輸入

一行包括三個整數M、N、X,相鄰兩個整數之間用單個空格隔開。M、N、X均爲不超過10000的正整數。

輸出

輸出一個整數,爲僱傭兵的最大戰鬥力。

樣例輸入

5 2 10

樣例輸出

6
#include <iostream>
using namespace std;
int main()
{
	int m,n,x,t;
	cin>>m>>n>>x;
	while(x>0)
	{
		t=m/n;
		if(m%n!=0)
			t++;			//這個t不是上升過後的點數 
		if(x<t)
			break;			//當x<t,即x-t<0,能量元素小於零,跳出循環 
		x-=t;				//減過後的能量元素 
		t=m/n;
		n+=t;				//戰鬥力上升過後的點數 
	}
	cout<<n;
	return 0;
}

38:計算多項式的導函數

總時間限制: 1000ms

內存限制: 65536kB

描述

計算多項式的導函數是一件非常容易的任務。給定一個函數f(x),我們用f'(x)來表示其導函數。我們用x^n來表示x的n次冪。爲了計算多項式的導函數,你必須知道三條規則:

(1)、(C)' = 0 如果C是常量

(2)、(C*x^n)' = C*n*x^(n-1) 如果n >= 1且C是常量

(3)、(f1(x)+f2(2))' = f1'(x)+f2'(x)

容易證明,多項式的導函數也是多項式。

現在,請你編寫一個程序,給定一個不包含負係數且已合併好同冪次項的多項式f(x),計算出它的導函數。

輸入

輸入有兩行。
第一行是一個整數n(0 <= n <= 100)表明多項式的最高次冪爲n。
第二行包含n+1個非負整數,Cn ,Cn-1 ,Cn-2 ,Cn-3 ,Cn-4 ,… ,C1,C0(0 <= Ci <= 1000)且Cn != 0。Ci是冪次爲i的項的係數。

輸出

在一行內輸出f'(x)的結果。
(1) 如果g(x) = 0那麼直接輸出0
(2) 如果g(x)形如Cm(x^m)+Cm-1(x^(m-1))+…+C0(Cm!=0)那麼輸出Cm…C0
(3) 相鄰整數之間有單個空格。

樣例輸入

3
0
10
2
3 2 1
3
10 0 1 2

樣例輸出

0
6 2
30 0 1
#include<cstdio>
int main()
{
        int n,c;
        scanf("%d",&n);
        if(!n)
        {
            printf("0");
            return 0;
        }
        for(int i=n;i>0;i--)
        {
            scanf("%d",&c);
            printf("%d ",c*i);
        } 
        return 0;
}

39:與7無關的數

總時間限制: 1000ms

內存限制: 65536kB

描述

一個正整數,如果它能被7整除,或者它的十進制表示法中某一位上的數字爲7,則稱其爲與7相關的數.現求所有小於等於n(n < 100)的與7無關的正整數的平方和.

輸入

輸入爲一行,正整數n(n < 100)

輸出

輸出一行,包含一個整數,即小於等於n的所有與7無關的正整數的平方和。

樣例輸入

21

樣例輸出

2336
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,sum=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		if((i%7)!=0&&(i%10)!=7&&(i/10)!=7)
		{
			j=i*i;
			sum+=j;
		}
	}
	cout<<sum;
	return 0;
}

40:數1的個數

總時間限制: 1000ms

內存限制: 65536kB

描述

給定一個十進制正整數n,寫下從1到n的所有整數,然後數一下其中出現的數字“1”的個數。

例如當n=2時,寫下1,2。這樣只出現了1個“1”;當n=12時,寫下1,2,3,4,5,6,7,8,9,10,11,12。這樣出現了5個“1”。

輸入

正整數n。1 <= n <= 10000。

輸出

一個正整數,即“1”的個數。

樣例輸入

12

樣例輸出

5
#include <iostream>
using namespace std;
int main()
{
	int n,i,temp,sum=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		temp=i;
		while(temp!=0)
		{
			if(temp%10==1)
				sum++;
			temp/=10;
		}
	}
	cout<<sum;
	return 0;
}

41:數字統計

總時間限制: 1000ms

內存限制: 65536kB

描述

請統計某個給定範圍[L, R]的所有整數中,數字2出現的次數。

比如給定範圍[2, 22],數字2在數2中出現了1次,在數12中出現1次,在數20中出現1次,在數21中出現1次,在數22中出現2次,所以數字2在該範圍內一共出現了6次。

輸入

輸入共 1 行,爲兩個正整數 L 和 R,之間用一個空格隔開。

輸出

輸出共 1 行,表示數字 2 出現的次數。

樣例輸入

樣例 #1:
2 22

樣例 #2:
2 100

樣例輸出

樣例 #1:
6

樣例 #2:
20
#include <iostream>
using namespace std;
int main()
{
	int L,R;
	int i,n,sum=0;
	cin>>L>>R;
	for(i=L;i<=R;i++)
	{
		n=i;
		while(n!=0)
		{
			if(n%10==2)
				sum++;
			n/=10;
		}
	}
	cout<<sum;
	return 0;
}

42:畫矩形

總時間限制: 1000ms

內存限制: 65536kB

描述

根據參數,畫出矩形。

輸入

輸入一行,包括四個參數:前兩個參數爲整數,依次代表矩形的高和寬(高不少於3行不多於10行,寬不少於5列不多於10列);第三個參數是一個字符,表示用來畫圖的矩形符號;第四個參數爲1或0,0代表空心,1代表實心。

輸出

輸出畫出的圖形。

樣例輸入

7 7 @ 0

樣例輸出

@@@@@@@
@     @
@     @
@     @
@     @
@     @
@@@@@@@
#include <iostream>
using namespace std;
int main()
{
    int h,w,i,j;
    char n;
    bool x;
    cin>>h>>w>>n>>x;
    for(i=1;i<=h;i++)
    {	
    	if(x==1)
    		for(j=1;j<=w;j++)
				cout<<n;	
    	if(x==0)
    		for(j=1;j<=w;j++)
    			if(i!=1&&i!=h&&j!=1&&j!=w)
    				cout<<" ";
    			else
    				cout<<n;
		cout<<endl;
	}
	return 0;
}

43:質因數分解

總時間限制: 1000ms

內存限制: 65536kB

描述

已知正整數 n 是兩個不同的質數的乘積,試求出較大的那個質數。

輸入

輸入只有一行,包含一個正整數 n。

對於60%的數據,6 ≤ n ≤ 1000。
對於100%的數據,6 ≤ n ≤ 2*10^9。

輸出

輸出只有一行,包含一個正整數 p,即較大的那個質數。

樣例輸入

21

樣例輸出

7
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
        int n;
        cin>>n;
        for(int i=2;i<sqrt(n);i++)
            if(n%i==0)
            {
                cout<<n/i;
                break;
            } 
        return 0;
}

44:第n小的質數

總時間限制: 1000ms

內存限制: 65536kB

描述

輸入一個正整數n,求第n小的質數。

輸入

一個不超過10000的正整數n。

輸出

第n小的質數。

樣例輸入

10

樣例輸出

29
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	long n,i=2,count=0;
	long j,flag,t;
	cin>>n;   
	while(count<n)
	{
		j=2;
		flag=0;
		for(j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				flag=1;
				break;
			}
		}
		if(flag==0)   
			count++;
		i++;
	}
	cout<<i-1;
	return 0;
}

45:金幣

總時間限制: 1000ms

內存限制: 65536kB

描述

國王將金幣作爲工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣;之後兩天(第二天和第三天)裏,每天收到兩枚金幣;之後三天(第四、五、六天)裏,每天收到三枚金幣;之後四天(第七、八、九、十天)裏,每天收到四枚金幣……這種工資發放模式會一直這樣延續下去:當連續N天每天收到N枚金幣後,騎士會在之後的連續N+1天裏,每天收到N+1枚金幣(N爲任意正整數)。

你需要編寫一個程序,確定從第一天開始的給定天數內,騎士一共獲得了多少金幣。

輸入

一個整數(範圍1到10000),表示天數。

輸出

騎士獲得的金幣數。

樣例輸入

6

樣例輸出

14
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int t=0,s=0,z=0;//t表示當前每天可以得到幾枚金幣,s表示當前金幣總數,z表示當前總天數 
    while(1)
    {
        t++;
        if(t+z>n) 
            break;
        /*t=a既可以表示當前每天可以得到a枚金幣,也可以表示得a枚金幣的狀態即將持續a天
        ,注意是即將持續,也就是這a*a枚金幣在這時還沒有累積,而z是當前已經計算了的天數。
        當t+z>n時,也就是如果用a*a的當時累加,會使得到金幣的天數>n,
        所以要break,通過後面的for循環一天一天的加。*/
        
        s+=t*t;        //t*t爲這t天一共可得的金幣數
        z+=t;
    }
    for(int i=z+1;i<=n;i++) 
        s+=t;
    /*當上面t+z=n時,不會break,累加一次t*t,
    此時恰好得了n天的金幣,z=n,for循環條件不滿足,不執行。*/
    cout<<s;
    return 0;
}

如有錯誤,歡迎指正!

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