1. 程式人生 > >演算法的樂趣c/c++ —— 1.1.7入門習題

演算法的樂趣c/c++ —— 1.1.7入門習題

宣告:摘選自“ 演算法競賽入門經典(第2版)”作者:  劉汝佳  /  陳鋒   ISBN:9787302291077

習題1得分給出
           一個由O和X組成的串(長度為1~80),統計得分。每個O的得分為目前連續出現的O的個數,X的得分為0.例如,OOXXOXXOOO的得分為1 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 2 + 3。
解題思路:

我們設定一箇中間變數沉默用來儲存ö的個數即ö出現連續次數的分數,當出現X時,NUM置零,通過判斷NUM的值來計算得分。

#include<stdio.h>
#include<string.h>
int main()
{
	char s[90];                  //定義一個字串
	int sum=0, num=0;           //sum用於記錄得分,num記錄O連續出現的次數
	scanf("%s", s);             //輸入字串
	int len = strlen(s);        //記錄輸入字串的長度
	for(int i=0; i<len; i++)    //迴圈讀取單個字元 
	{
		if(s[i] == 'O')         //如果字元為 O ,num自加,sum等於num累加和 
		{
			num++;
			sum += num;
		}
		else                    //如果不為O,num歸零 
		{
			num = 0;
		}
		if(i==len-1) printf("%d", num); else printf("%d+", num);	//如果不是最後一位數,列印 1+ 格式,否則只打印數字 1格式	
	}
	printf(" = %d", sum);       //列印總得分
	return 0; 

} 

分子量

        給出一種物質的分子式(不帶括號),求分子量。本題中的分子式只包含4種原子,分別為C,H,O,N,原子量分別為12.01,1.008,16.00,14.01(單位:g / mol)。例如,C6H5OH的分子量為94.108g / mol。
 解題思路:

   首先我們利用元素減去 'A' 的ASCII碼當索引值來儲存原子質量。然後通過判斷字串元素的ASCII碼來判斷是原子還是數字(數字的ASCII最大為57,大寫字母的ASCII碼均大於57)。因為字串第一個元素必定是原子,所以我們就將判斷下一個元素是數字還是原子,如果是原子,那麼總質量暫時等於原子質量。如果為數字,那麼我們就需要繼續判斷數字的下一個元素為數字還是原子,如果為原子,那麼總質量就暫時等於原子質量乘以數字。如果為數字,那麼我們就需要判斷再下一位元素為數字還是原子了。重複此過程,直到獲得分子量。如果元素個數只是個位數的話,這個程式會簡單很多。

最後一位元素如果為原子,那麼是不會加到分子質量裡面的,所以在最後我們需要手動加上最後一個元素的原子質量。如果最後一位為數字,那麼就沒有此問題。

下面是程式碼,裡面也進行了詳細的介紹:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	double num=0;                    //定義分子量總和 
	float name[15];               /*定義陣列來存放四種原子質量
	                              name2為C原子質量,name7為H原子質量,name13為N原子質量,name14為O原子質量
	                              name的索引值是由 ‘原子符號’-‘A’獲得的ASCII碼 */
	name[2]=12.01, name[7]=1.008, name[13]=14.01, name[14]=16.00; 
	char s[20];                   //定義輸入字串
	scanf("%s", s);               //輸入字串 
	int len = strlen(s);          //計算輸入字串的長度
	for(int i=0; i<len; i++)      //迴圈讀取每個字串 
	{
		double qul=0;                //用於記錄某一個原子的質量 
		if(int(s[i]) > 57)        //如果s[i]的ASCII碼大於57,說明這是一個原子 
		{
			qul = name[int(s[i]-'A')];             //獲取原子的原子質量 
			if(i+1 <= len && int(s[i+1]) > 57)  //如果下一個元素是原子,那麼只加一次質量
			{
				num += qul;
			} 
			else                  //如果下一個元素不是原子,那麼就要計算是數字多少了 
			{
				int j = 0;        //j用於記錄有幾位數字 
				int val = 0;      //用來記錄是數字幾 
				while(j+i+1 < len && int(s[j+i+1]) < 57) //只要是數字就迴圈計數 
				{
					j ++;       
				}
				for(int m=0; j>0; j--,m++)
				{
					val += float(s[m+i+1]-'0') * pow(10,j-1);    //pow(10,n)為10的n次方 ,value為原子的個數 
				
				}
				num += qul*val;                                //得到val個原子的原子質量 
			}
		} 
	} 
	printf("%f g/mol\n", num+name[int(s[len-1]-'A')]);                   //因為最後一個元素 無法判斷,所以在最後面加上最後一個原子質量 
	return 0;

}