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

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

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

數數字

把前N(n≤10000)個整數順次寫在一起:123456789101112 ...數一數0〜9各出現多少次(輸出10個整數,分別是0,1,...,9出現的次數)。

解題思路:

如果一次性輸入1-20個,即1234567891011121314151617181920,計算機不可能一次性體處理這麼大的資料量,所以通過不斷取餘數從而獲得個位數來計數的方法就不可靠了,如果我們可以一邊輸入一邊處理資料,這樣既可以達到實時性,又能夠節約資源.getchar()函式可以幫助我們完成這個工作。首先我們需要匯入<string.h>的這個庫。然後利用而迴圈不斷讀取輸入的數字,直到遇見換行符“\ n”(windows系統)就結束迴圈,輸出計數。這個程式非常簡單,只要你能夠想到使用getchar()函式來處理

#include<stdio.h>
#include<string.h>                             //為了使用getchar()函式 
int main() 
{
	int c, list[11];                           // list[]用於存放0-9各個數字的個數 
	memset(list, 0, sizeof(list));             //將存放整數的陣列初始化歸零 
	while((c=getchar()) && (c!='\n'))           //使用getchar()函式可以邊輸入邊處理,否則數值太大不能一次性處理 
	{
		list[c-'0'] ++;                         //如果輸入的不是回車鍵(windowsxitong)就不斷迴圈處理,否則退出
		                                        //獲得的c是輸入字元的ASCII碼,需要將其減去‘0’獲得其真正的數值 
	}
	for(int i=0; i<=9; i++) printf("%d ", list[i]);   //將0-9所有數字的個數打印出來 
} 

週期串

如果一個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如,abcabcabcabc以3為週期(注意,它也以6和12為週期)。輸入一個長度不超過80的字串,輸出其最小週期。
解題思路:

我們採用環形字串的思想,依次以字串的字母為開始,建立len(字串長度)個首尾相連的字元,如果第n個字串與原始字串完全相等,說明字串的最小週期就是N;如圖所示:

#include<stdio.h>
#include<string.h>
int main() 
{
	char c[90];                                      //定義一個字串陣列來儲存環形字串 
	char s[90];                                      //用於儲存輸入字串 
	scanf("%s",s);                                     
	int len = strlen(s);                             //計算有多少個字元,strlen()函式來自string.h庫 
	for(int i=0; i<len; i++)                         //利用環形字串將字元迴圈儲存 
	{
		int n = i, m=0;                              //n是充當指標作用記錄儲存的第一個字元在s陣列的位置,m是一個標誌位,為了判斷新陣列是否等於原陣列 
		for(int j=0; j<len; j++)                     //利用for迴圈,將陣列按照環形陣列儲存到新的陣列, 
		{
			if(n+2 > len) n= -1;                     //如果n+2大於len說明已經超出原陣列長度,那麼就重置將n=-1,從頭開始繼續讀取原陣列,直到讀滿len個長度 
			c[j] = s[n+1];
			n++;
		} 
		for(int j=0; j<len; j++)                     //依次將新陣列與原陣列單個元素比較,如果全部都相等,那麼就說明這個新陣列的i就是最小週期 
		{
			if(c[j] != s[j]) m = 1;                  //其實可以直接兩個字串比較,會更簡單,但是我的字串總是在串尾列印“齜",所以我只能單個元素比較了 
		}
		if(m == 0)
		{
			printf("%d", i+1);                       //如果標誌位m為0,說明現在就是最小週期,那麼就列印週期數 i+1 
			return 0;
		} 
	}
	return 0;
}