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

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

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

讀入一些整數,逆序輸出到一行中。已知整數不超過100個。如何編寫這個程式呢?首先是迴圈讀取輸入。讀入每個整數以後,應該做些什麼呢?思來想去,在所有整數全部讀完之前,似乎沒有其他事可做換句話說,只能把每個數都存下來存放在哪裡呢答案是:。。?陣列

#include<stdio.h>
int a[110];    //定義陣列,大小為110 陣列放在外面是為了防止陣列定義過大時,在main函式裡面會導致異 
               //常退出
int main()
{
	int input, i = 1;
	while(scanf("%d",&input) == 1)
	{
		a[i++] = input;
		if(input == 0)  //以0為輸入結束符 
		{
			break;
		}
		
	}	
	for(int j=i-2; j>=1; j--)
	{
		printf("%d",a[j]);  //翻轉列印除0之外的所有元素 
	}
	return 0;
	
}

        開燈問題。有Ñ盞燈,編號為1〜n的。第1個人把所有燈開啟,第2個人按下所有編號為2的倍數的開關(這些燈將被關掉),第3個人按下所有編號為3的倍數的開關(其中關掉的燈將被開啟,開著的燈將被關閉),依此類推。一共有ķ個人,問最後有哪些燈開著?輸入ñ和K,輸出開著的燈的編號.k≤n≤1000。
樣例輸入:
7 3
樣例輸出:
1 5 6 7
 

#include<stdio.h>
#include<string.h>
int list[1010]; 
int main()
{
	int n, k;
	scanf("%d%d", &n, &k);   //定義輸入的兩個數字 
	memset(list, 0, sizeof(list)); //使用memset函式將陣列list全部置零,0表示燈處於關閉狀態
	for(int i=1; i<=k; i++)         //輸入多少人,迴圈多少次 
	{
		for(int j=1; j<=n; j++)     //有多少盞燈,就對燈進行多少次操作 
		{
			if(j%i == 0)            //如果餘數為0,則說明是第幾個人的倍數,就對燈進行取反操作 
			{
				list[j] = !list[j];
			}
		}
	} 
	for(int m=1; m<=n; m++)         //迴圈讀取燈的狀態,如果為 1 即亮燈狀態 ,則列印燈的編號 
	{
		if(list[m]==1)
		{
			printf("%d", m);
			printf(" ");
		}
	}
	return 0;
	
}