”藍橋杯“練習系統 基礎練習(31/34)


前言

  • 環境:Dev c++
  • 萬能頭文件: #include<bits/stdc++.h>
  • 水平不高,不喜勿噴,有問題可以評論區告訴我,謝謝

基礎練習

BASIC-01 A+B問題

解題思路

  • 不需要思路

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main() {
	int a,b;
	cin>>a>>b;
	cout<<a+b; 
	return 0;
}

BASIC-02 序列求和

解題思路

  • 利用等差數列求和公式求和
  • 注意數據范圍!

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main() {
	long long n;
	cin>>n;
	cout<<(1+n)*n/2;
	return 0;
}

BASIC-03 圓的面積

解題思路

  • 利用圓的面積公式
  • pi需要定義,這里使用的是acos(-1.0)
  • 注意輸出格式

AC代碼

#include<bits/stdc++.h>
#define pi acos(-1.0)
using namespace std;
int main() {
	int r;
	cin>>r;
	double s=r*r*pi;
	printf("%.7lf",s);
	return 0;
}

BASIC-04 Fibonacci數列

解題思路

  • 斐波那契數列
  • 直接遞歸的方法超時了,就用數組存了一下
  • 不用求出結果再取模,直接取模

AC代碼

#include<bits/stdc++.h>
using namespace std;
long long a[1000050];
int main( )
{
	int n;
	cin>>n;
	a[1]=a[2]=1;
	for(int i=3;i<=n;i++)
	{
		
		a[i]=(a[i-1]+a[i-2])%10007;	
	}
	cout<<a[n];
}

BASIC-1 閏年判斷

解題思路

  • 簡單的判斷語句

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int y;
	cin>>y;
	if((y%4==0&&y%100!=0)||y%400==0)
	      cout<<"yes";
	else
	      cout<<"no";
	return 0;
}

BASIC-2 01字串

解題思路

  • 抱着好玩的想法,我將32個情況一一輸出了,結果居然通過了??這也是沒有辦法的辦法,代碼就不貼了,就無腦輸出就行了
  • 我的方法是0-31一共32個數,想辦法用二進制表示,

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=0;i<=31;i++)
	{
		int j=i;
		cout<<j/16;      //第一位表示有幾個16
		j%=16;           
		cout<<j/8;       //對16取模后有幾個8
		j%=8;
		cout<<j/4;       //對8取模后有幾個4
		j%=4;
		cout<<j/2;       //對4取模后有幾個2
		j%=2;
		cout<<j;         //對2取模有幾個1(即本身)
		cout<<endl;
	}
	return 0;
}

BASIC-3 字母圖形

解題思路

  • 跟上題一樣,如果實在沒有方法,可以定義a[26][26]將完整的表輸進去,然后再輸出n行m列
  • 先將對角線全賦值為A,再向左向右進行賦值

AC代碼

#include<bits/stdc++.h>
using namespace std;
char a[27][27];
int main( )
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<26;i++)                     //輸入完整的表
	{
		a[i][i]='A';
		
		for(int j=0;j<26-i;j++)
			a[i][i+j]='A'+j;
			
		for(int k=0;k<=i;k++)
			a[i][i-k]='A'+k;

	}
	for(int i=0;i<n;i++)                      //輸出n行m列
	{
		for(int j=0;j<m;j++)
		{
			cout<<a[i][j];
		}	
		cout<<endl;
	}
	return 0;
}

BASIC-4 數列特征

解題思路

  • 先把數存進數組
  • 簡單的最大最小值比較再賦值還有sum求和,注意maxm的初值要設的小於-10000,一開始我設的0沒能過

AC代碼

#include<bits/stdc++.h>
using namespace std;
int a[10050];
int main( )
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}	
	int maxm=-10010;
	int minm=10010;
	int sum=0;
	for(int i=0;i<n;i++)
	{
		if(maxm<=a[i])
			maxm=a[i];
		if(minm>=a[i])
			minm=a[i];
		sum+=a[i];		
	}
	cout<<maxm<<endl<<minm<<endl<<sum;
	return 0;
}

BASIC-5 查找整數

解題思路

  • 簡單的遍歷然后判斷輸出,注意下標得加1

AC代碼

#include<bits/stdc++.h>
using namespace std;
int a[1050];
int main( )
{
	int n,m;	
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	cin>>m;
	for(int i=0;i<n;i++)
	{
		if(a[i]==m)
		{
			cout<<i+1;   //下標加一代表是第幾個數,因為下標從0開始
			return 0;
		}	
	}	
	cout<<-1;
	return 0;
}

BASIC-6 楊輝三角形

解題思路

  • 簡單的楊輝三角,方法看注釋

AC代碼

#include<bits/stdc++.h>
using namespace std;
int a[34][34];
int main( )
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		a[i][i]=1;        //左對角線全賦為1
		a[i][0]=1;        //第一列全賦為1
	}
	for(int i=2;i<n;i++)
	{
		for(int j=1;j<i+1;j++)
			a[i][j]=a[i-1][j-1]+a[i-1][j];//從a[2][1]開始遍歷賦值,每個等於肩上的兩數之和
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i+1;j++)    //這邊的輸出方法有點小講究,我也不知道每行后面多個空格會不會錯,但是這樣寫肯定沒錯
		{
			if(j==0)
				cout<<a[i][j];
			else
				cout<<' '<<a[i][j];
		}
		cout<<endl;	
	}
	return 0;
}

BASIC-7 特殊的數字

解題思路

  • 通過剝離每位數字再三次方相加判斷是否和原數相等

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=100;i<=999;i++)
	{
		int n,a,sum=0;
		n=i;
		while(n)
		{
			a=n%10;        //第一次循環a是個位的數字,第二次循環是十位的數字,第三次是百位的數字
			n/=10;        
			sum+=pow(a,3);
		}	
		if(sum==i)
			cout<<i<<endl;
		
	}
	return 0;
}

BASIC-8 回文數

解題思路

  • 一樣通過剝離法,將每一位剝下來再乘10相加進行判斷

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=1000;i<10000;i++)
	{
		int n,a,sum=0;
		n=i;
		while(n)
		{
			a=n%10;
			n/=10;
			sum*=10;
			sum+=a;
			
		}
		if(i==sum)
			cout<<i<<endl;
	}
	return 0;
}

BASIC-9 特殊回文數

解題思路

  • 與上題類似,但還需要將剝離下來的數字進行相加求和,需要兩個判斷同時為true

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int m;
	cin>>m;
	for(int i=10000;i<1000000;i++)
	{
		int n,a,sum1=0,sum2=0;
		n=i;
		while(n)
		{
			a=n%10;          //剝離個位
			n/=10;           //自身除10
			sum1*=10;        
			sum1+=a;          //sum1求翻轉的數字
			sum2+=a;          //sum2求各位上數字之和
		}	
		if(sum1==i && sum2==m)
			cout<<i<<endl;
		
	}
	return 0;
}

BASIC-10 十進制轉十六進制

解題思路

  • 了解進制轉化的方法,詳情見代碼注釋
  • 這種題不難但是麻煩,需要不斷地進行修正調試

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{	long long n;                                      //注意數據范圍
	cin>>n;
	int i=0,j=0,k,r;
	char ans[10];
	if(n==0)
		cout<<'0';
	else
	{	while(n)                                  //這個循環是將十進制從后向前轉為十六進制,最后需要倒序輸出
		{	
			r=n%16;                          //對16取模
			if(r<10)                         //轉為十六進制
				ans[i++]=char(r+'0');    
			else
				ans[i++]=char(r-10+'A');
			n/=16;                            //n自身除16
		}
	}
	for(k=i-1;k>=0;k--)
		cout<<ans[k];                              //倒序輸出
	return 0;
}

BASIC-11 十六進制轉十進制

解題思路

  • 以FFFF為例,第一次sum為15,第二次為1516+15,第三次為(1516+15)16+15,第四次為((1516+15)16+15)16+15,即15163+15*162+15161+15*160

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	char a[8];
	cin>>a;
	long long sum=0;
	for(int i=0;i<strlen(a);i++)
	{
		if(a[i]>='0' && a[i]<='9')
			sum=sum*16+(int)(a[i]-'0');
		else
			sum=sum*16+(int)(a[i]-'A'+10);
	}
	cout<<sum;
	return 0;
}

BASIC-12 十六進制轉八進制

解題思路

  • 一開始我想的是十六先轉十再轉八,但是數據范圍為0-100000位十六進制,超過long long的范圍(我WA了n次才發現這個問題)
  • 借鑒了一個朋友的方法,受益匪淺 https://www.cnblogs.com/longwind7/p/15546041.html

AC代碼

#include<bits/stdc++.h>
using namespace std;
string _16_2_(string str)
{
	string a="";
	for(int i=0;i<str.size();i++)
	{
		switch(str[i])          //將十六進制轉為四位四位的二進制
		{
			case '0': a+= "0000"; break;
			case '1': a+= "0001"; break;
			case '2': a+= "0010"; break;
			case '3': a+= "0011"; break;
			case '4': a+= "0100"; break;
			case '5': a+= "0101"; break;
			case '6': a+= "0110"; break;
			case '7': a+= "0111"; break;
			case '8': a+= "1000"; break;
			case '9': a+= "1001"; break;
			case 'A': a+= "1010"; break;
			case 'B': a+= "1011"; break;
			case 'C': a+= "1100"; break;
			case 'D': a+= "1101"; break;
			case 'E': a+= "1110"; break;
			case 'F': a+= "1111"; break;
			default: break;	
		}
	}
	return a;
}
string _2_8(string str)        //再將二進制轉為八進制,注意要進行補0,將二進制補為3的整數倍
{
	string a;
	switch(str.size()%3)
	{
		case 0:break;
		case 1:str="00"+str;break;
		case 2:str="0"+str;break;
		default:break;
	}
	for(int i=0;i<str.size();i+=3)
	{
		int m=(str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0');
		a+=(m+'0');
	}
	return a;
} 


int main( )
{
	int n;
	cin>>n;
	string s;
	while(n--)
	{
		cin>>s;
		string a=_16_2_(s);			//先轉為二進制
		string b=_2_8(a); 			//再轉為八進制
		int k=b.size();
		int p=0;  
		while(b[p]=='0') p++;                  //題目中要求輸出時前面不需要帶0所以從不是0的時候開始
		for(int i=p;i<k;i++) cout<<b[i];
		if(n>=1)      cout<<endl;              //這一行必不可少,少輸出換行就是錯的的
	}     
	return 0;
}

BASIC-13 數列排序

解題思路

  • 方法一:利用c++的函數庫sort進行排序
  • 方法二:簡單的排序算法,我這里寫的是選擇排序,還有很多種排序法

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int n;
	cin>>n;
	int a[250];
	for(int i=0;i<n;i++)
		cin>>a[i];
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(a[i]>a[j])
			{
				int temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}			
		}
	}
	for(int i=0;i<n;i++)
	{
		if(i==0)
			cout<<a[i];
		else
			cout<<' '<<a[i];
	}

	return 0;
}

至此非VIP的習題部分已經完畢

以下為VIP習題部分


BASIC-14 時間轉換

解題思路

  • 輸入的數字為分鍾,通過除法、取余可得到答案

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int t;
	cin>>t;
	int h,m,s;
	h = t / 3600;  // 總分鍾除3600==小時數
	m = (t % 3600)/60;  // 余數部分除60==分鍾數
	s = ( (t % 3600) % 60);  // 余數部分除60==秒數
	cout<<h<<':'<<m<<':'<<s<<endl;	
	return 0;
} 

BASIC-15 字符串對比

解題思路

  • 通過字符串內置函數進行求解

AC代碼

#include<bits/stdc++.h>
#include<string.h>
using namespace std;
string f(string a)    //將字符串全部轉為大寫
{
	for(int i=0; i < a.size(); i++)
	{
		if(islower(a[i]))
			a[i]=a[i]-32;	
	}
	return a;
}
string a,b,A,B;
int main( )
{
	cin>>a>>b;
	A=f(a);    //轉大寫
	B=f(b);    //轉大寫
	if(a.length()!=b.length())   //長度不相等
		cout<<'1'<<endl;
	else if(a.compare(b)==0)      //原字符串相等
		cout<<'2'<<endl; 
	else if(A.compare(B)==0)      //原字符串不相等,但不區分大小寫時相等。即統一大小寫后比較
		cout<<'3'<<endl;
	else                          //其他
		cout<<'4'<<endl;
	return 0;
}

BASIC-16 分解質因數

解題思路

  • 遍歷,判斷是否素數,是素數輸出本身
  • 若不是素數,則進行自身整除素數(從小到大)

AC代碼

#include<bits/stdc++.h>
using namespace std;
int a,b;
int isprime(int a)     //判斷是否素數
{
	if(a==1 || a==2)
		return 1;
	for(int i=2;i<=sqrt(a);i++)
		if(a%i==0)
			return 0;
	return 1;	
	
}
int main( )
{
	cin>>a>>b;
	for(int i=a;i<=b;i++)
	{
		if(isprime(i)==1)       //本身為素數
			cout<<i<<'='<<i<<endl;
		else
		{
			cout<<i<<'=';
			int t=i;
			for(int j=2;j<=t;j++)    //枚舉可能的因數
			{
				if(isprime(j)==1 && t%j==0)    //因數是素數,且可以被整除
				{
					if(t==i)                //注意輸出的格式
						cout<<j;
					else
						cout<<'*'<<j;
					t/=j;   //自身除以該因數后繼續判斷
					j--;    //需要自減,質因數可能相同如:8=2*2*2
				}
			}
			cout<<endl;
		}
	}
	return 0;
}

BASIC-17 矩陣乘法

解題思路

  • 矩陣乘法

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main()
{
 int N,M,i,j,k,t=1;//N是N階矩陣,M是M次冪,i,j,k,t都是計數 
 scanf("%d%d",&N,&M);
 int A[N][N],F[N][N],B[N][N];
 for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
  {
   scanf("%d",&A[i][j]);//給A矩陣賦值 
   B[i][j]=A[i][j];//讓B矩陣和A矩陣相同 
   F[i][j]=0; 
  }
 }
 //注意:要對 M 的值討論; M=0, M=1, M!=0&&M!=1; 這三種情況討論 
 if(M==0)//對 M=0 的討論 
 {
  for(i=0;i<N;i++)
  {
   F[i][i]=1;
  }
 }
 if(M==1)//對 M=1 的討論 
 {
  for(i=0;i<N;i++)
  {
   for(j=0;j<N;j++)
   {
    F[i][j]=A[i][j]; 
   }
  } 
 }
 while(t<M)//對 M!=0&&M!=1 的討論 
 {
  for(i=0;i<N;i++)
  {
   for(j=0;j<N;j++)
   {
    F[i][j]=0;
    for(k=0;k<N;k++)
    {
     F[i][j]+=A[i][k]*B[k][j];//此處用了矩陣乘法的規律 
    }
   }
  }//此處是A矩陣的平方,即是A*A; 
  for(i=0;i<N;i++)
  {
   for(j=0;j<N;j++)
   {
    B[i][j]=F[i][j];
   }
  }//此處是為更高次冪准備,即 A*A*A=F*A,但為了使用上面的規律,故F=B,使得:A*A*A=A*B 
  t++;//為了記住乘了幾次 
 }
 for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
  {
   printf("%d ",F[i][j]);
  }
  printf("\n");
 }//此處輸出值 
 return 0;
}


BASIC-18 矩形面積交

解題思路

  • 要求兩個矩形的面積交集,只需要知道下方矩形的右上頂點 和上方矩形的左下頂點即可

AC代碼

#include<bits/stdc++.h>
using namespace std;
int main()
{
	double x1,y1,x2,y2,x3,y3,x4,y4;
	cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
	double a1,a2,b1,b2;
	a1=max(min(x1,x2),min(x3,x4));
	a2=max(min(y1,y2),min(y3,y4));
	b1=min(max(x1,x2),max(x3,x4));
	b2=min(max(y1,y2),max(y3,y4));
	if(b1 > a1 && b2 > a2)  //判斷是否有交集
		printf("%.2f",(b1-a1)*(b2-a2));
	else printf("0.00");
	return 0;
}

BASIC-19 完美的代價

解題思路

AC代碼



BASIC-20 數的讀法

解題思路

  • 從前往后遍歷字符串,根據其位置進行輸出相應的拼音

AC代碼

#include<bits/stdc++.h>
using namespace std;

int main()  
{  
    char a[100];
	int i,j,k,l;  
    char b[20][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};  
    char c[20][10]={"","","shi","bai","qian","wan","shi","bai","qian","yi","shi"};  
    gets(a);  
    l=strlen(a);   //取長度
    
    for(i=0;i<l;i++){  
        j=a[i]-48;  
        if(j==0)
	{
		if(i<l-1 && a[i+1]!=48)
		  printf("%s ",b[j]);
	}
	else   
        if((l-i==2||l-i==6||l-i==10) && j==1)
			printf("%s ",c[l-i]);  
        else if(a[i-1]==48 && j==1)
			printf("%s ",c[l-i]);  
        else 
			printf("%s %s ",b[j],c[l-i]);  
    }  
    printf("\n");  
    return 0;  
} 

BASIC-21 Sine之舞

解題思路

  • 直接根據規律進行輸出
  • A1=sin(1) A2=sin(1-sin(2))
  • S1=A1+1=sin(1)+1 S2=(A1+2)A2+1=(sin(1)+2)sin(1-sin(2))+1

AC代碼

#include<bits/stdc++.h>
using namespace std;

int n;
void A(int n)    //求A
{
	for(int i=1;i<=n;i++)
	{
		cout<<"sin("<<i;
		if(i%2==0 && i!=n)  //正負號交替
			cout<<'+';
		else if(i!=n)
			cout<<'-';
			
	}	
	for(int i=1; i<=n; i++)
    {
        cout<<")";
    }
}

void S(int n)    //求S
{
    int i;
    for(i=1;i<n;i++)
    {
        cout<<"(";
    }
    for(i=1;i<n;i++)
    {
        A(i);
        cout<<"+"<<n-i+1<<")";
    }
    A(i);
    cout<<"+"<<'1'<<endl;
}

int main( )
{
	cin>>n;	
	S(n);
	return 0;
} 

BASIC-22 FJ的字符串

解題思路

  • 用字符串加法,進行遞推

AC代碼

#include<bits/stdc++.h>
using namespace std;
int n;
int main( )
{
	cin>>n;
	string a="";
	for(int i=1;i<=n;i++)
	{
		char b='A'+i-1;
		a=a+b+a;  //每次只改變中間的b值
	}	
	cout<<a;
}

BASIC-23 芯片測試

解題思路

  • 假設好芯片為m個,壞芯片為n個,由於壞芯片測試其他芯片的結果是隨機的,則若一個芯片是好芯片,他的所有評測結果中滿足:m<= 1的個數 <=m+n
  • 即當一個芯片評測結果中1的個數大於0的個數時,該芯片為好芯片
  • 即計算每一列中1和0的個數進行比較

AC代碼

#include<bits/stdc++.h>
using namespace std;

const int N=25;

int n;
int g[N][N];

int main( )
{
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>g[i][j];	

	int j=1,count=0;
	while(j<=n)
	{
		int sum1=0,sum2=0;   //sum1為1的數量,sum2為0的數量 
		for(int i=1;i<=n;i++)
		{	
			if(g[i][j]==1)
				sum1++;
			else
				sum2++;
		} 
		if(sum1>sum2)
		{
			count++;
			if(count==1)
				cout<<j;
			else
				cout<<' '<<j;
		}
		j++;
	}
	
	return 0;
}

BASIC-24 龜兔賽跑預測

解題思路

  • 烏龜跑完的時間是固定的,模擬兔子的時間然后進行比較

AC代碼

#include<bits/stdc++.h>
using namespace std;

int v1,v2,t,s,l;

int main( )
{
	cin>>v1>>v2>>t>>s>>l;
	int T=l/v2;  //烏龜跑的時間T為固定值
	int sum1=0,sum2=0;
	int ans=0;
	while(1)
	{
		if(sum1==l) //兔子跑完
		    break;

		 
		sum1+=v1; //兔子跑的長度 
		sum2+=v2; //烏龜跑的長度
		
		ans++; //ans為時間
		
		if(sum1-sum2>=t && sum1!=l)  //兔子超過烏龜t米
		{
			ans+=s;		 //兔子休息s秒
			sum2+= v2*s;     //烏龜跑s秒的距離 
		}
	} 
	if(ans>T)
		cout<<'T'<<endl<<T;
	else if (ans < T)
		cout<<'R'<<endl<<ans;
	else
		cout<<'D'<<endl<<T; 
	return 0;
} 

BASIC-25 回形取數

解題思路

  • 一個數組g進行取數,一個數組st進行標記,對取過數的位置進行標記

AC代碼

#include<bits/stdc++.h>
using namespace std;

const int N=210;
int n,m;
int g[N][N];
bool st[N][N]={false};

int main( )
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++) 
		{
			cin>>g[i][j];
			st[i][j]=true;
		}
	int t=1;
	int i=0,j=0;
	cout<<g[0][0]; //[0][0]單獨拉出來
	st[0][0]=false;	
	while(t < n*m) //t為取數的總次數	
	{
		while(i+1<n && st[i+1][j])  //用四個while循環進行蛇形取數
		{
			cout<<' '<<g[++i][j];
			st[i][j]=false;
			t++;

		}
		while(j+1<m && st[i][j+1])
		{
			cout<<' '<<g[i][++j];
			st[i][j]=false;	
			t++;	

		}
		while(i-1>=0 && st[i-1][j])
		{ 
			cout<<' '<<g[--i][j];
			st[i][j]=false;
			t++;		

		}
		while(j-1>=0 && st[i][j-1])
		{
			cout<<' '<<g[i][--j];
			st[i][j]=false;
			t++;		

		}
	
	}
	return 0;
} 

BASIC-26 報時助手

解題思路

  • 簡單的判斷

AC代碼

#include<bits/stdc++.h>
using namespace std;
int h,m;
void f(int n)
{
	switch(n)
		{
		case 0:cout<<"zero";break;
		case 1:cout<<"one";break;
		case 2:cout<<"two";break;
		case 3:cout<<"three";break;
		case 4:cout<<"four";break;
		case 5:cout<<"five";break;
		case 6:cout<<"six";break;
		case 7:cout<<"seven";break;
		case 8:cout<<"eight";break;
		case 9:cout<<"nine";break;
		case 10:cout<<"ten";break;
		case 11:cout<<"eleven";break;
		case 12:cout<<"twelve";break;
		case 13:cout<<"thirteen";break;
		case 14:cout<<"fourteen";break;
		case 15:cout<<"fifteen";break;
		case 16:cout<<"sixteen";break;
		case 17:cout<<"seventeen";break;
		case 18:cout<<"eighteen";break;
		case 19:cout<<"nineteen";break;
		case 20:cout<<"twenty";break;
		case 30:cout<<"thirty";break;
		case 40:cout<<"forty";break;
		case 50:cout<<"fifty";break;
		}
}

int main( )
{
	cin>>h>>m;
	if(m==0)
	{
		if(h<=20) 
			f(h);
		else    //當數字大於20時,進行分離
		{
			f(h-h%10);  //整十部分
			cout<<' ';
			f(h%10);    //去掉整十的部分
		}	
		cout<<" o'clock";
	}
	else
	{
		if(h<=20)
			f(h);
		else
		{
			f(h-h%10);
			cout<<' ';
			f(h%10);
		}
		cout<<' ';
		if(m<=20)
			f(m);
		else
		{
			f(m-m%10);
			cout<<' ';
			f(m%10);
		}		
		
	}
	
	return 0;
}

BASIC-27 2n皇后問題

解題思路

AC代碼



BASIC-28 Huffuman樹

解題思路

AC代碼



BASIC-29 高精度加法

解題思路

AC代碼

#include<bits/stdc++.h>
#include<vector>
using namespace std;

const int N = 1e6+10;

vector<int> add(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size()) t+=A[i];
        if(i<B.size()) t+=B[i]; 
        C.push_back(t%10);
        t /=10;
    }
    if(t)
        C.push_back(1);
    return C;

}

int main()
{
    string a,b;
    vector<int>A,B;

    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--)  B.push_back(b[i]-'0');

    vector<int>C =add(A,B);

    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    return 0;
}



BASIC-30 階乘計算

解題思路

AC代碼

#include<bits/stdc++.h>
using namespace std;

const int N=1000000;
int n;


vector<int> mul(vector<int> &A,int b)
{

    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t;i++)
    {
        if(i<A.size())  t+=A[i]*b;
        C.push_back(t%10);
        t/=10;  
    } 
    return C;
}

int main( )
{
	string a="1";
	cin>>n;	
	vector<int> A;
	for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');
	
	for(int i=1;i<=n;i++)
	{
		A=mul(A,i);
	}
		
	for(int i=A.size()-1;i>=0;i--)
            printf("%d",A[i]);
	return 0;
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM