2014年4月10日 星期四

iStudy C Rivew參考解答

練習題
1.輸入月份,輸出該月天數
	int m;
	printf("請輸入月份", &m);
	scanf("%d", &m);
	if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m ==  12) {
		printf("%d月有31天", m);
	}
	if(m == 4 || m == 6 || m == 9 || m == 11) {
		printf("%d月有30天", m);
	}
	if(m == 2) {
		printf("%d月有28天", m);
	}
2.輸入一數字n,輸出1+2+....+n之答案,若n<0提示輸入錯誤
	int n, i, sum = 0;
	printf("請輸入n >");
	scanf("%d", &n);
	if(n > 0) {
		for(i = 1;i <= n;i++)
			sum +=i;
		printf("%d\n", sum);
	} else {
		printf("數字有誤\n");
	}
3.承2,若n<0,提示輸入錯誤,並重新輸入直到n>0為止(利用for)
	int n, i, sum = 0;
	for(;;)
	{
		printf("請輸入n >");
		scanf("%d", &n);
		if(n < 0) {
			printf("數字有誤\n");
		} else {
			break;
		}
	}

	for(i = 1;i <= n;i++) {
		sum +=i;
	}
	printf("%d\n", sum);
4.同3,利用while改寫
	int n, i, sum = 0;

	printf("請輸入n >");
	scanf("%d", &n);
	if(n < 0) {
		printf("數字有誤\n");
	}

	while(n < 0) {
		printf("請輸入n >");
		scanf("%d", &n);
		if(n < 0) {
			printf("數字有誤\n");
		}
	}
	for(i = 1;i <= n;i++) {
		sum = sum+i;
	}
	printf("%d\n", sum);
解題 1.輸入一個數,找最大質因數
  • 解法1
  • 	int n, max;
    	scanf("%d", &n);
    	int m;
    	for(m = 1;m <= n;m++) {
    		int i;
    		for(i = 2;m%i != 0 && i <= m/2;i++);
    		if(i <= m/2)
    			continue;
    	} 
    	if(n%m == 0) {
    		max = m;
    	}
    	printf("%d 的最大質因數為 %d", n, max);
    
  • 解法2
  • 	int n, max;
    	scanf("%d", &n);
    	int m;
    	for(m = 1;m <= n;m++) {
    		int i, flag = 0;
    		// 用flag去標記m是不是質數,如果被整除,他就不是質數,標記為0
    		for(i = 2;i <= m/2;i++) {
    			flag = 1;
    			if(m%i == 0) {
    				flag = 0;
    				break;
    			}
    		}
    
    		//若 flag被標記為1,表示m為質數,則驗證m是否為n的因數
    		if(flag == 1 && n%m == 0) {
    			max = m;
    		}
    	}
    	printf("%d 的最大質因數為 %d", n, max);
    
2.類題-質因數分解
	int n;
	scanf("%d", &n);
	int m = 2;
	while(n > 1) {
		if(n%m == 0) {
			n = n/m;
			printf("%d ", m);
		} else {
			m++;
		}
	}
3.利用輾轉相除法處理GCD(HCF)最大公因數問題
	int m, n, temporary;
	printf("請輸入第一個數字 >");
	scanf("%d", &m);
	printf("請輸入第二個數字 >");
	scanf("%d", &n);
	printf("GCD(%d, %d) = ", m, n);

	if(n > m) {
		temporary = m;
		m = n;
		n = temporary;
	}

	while(n > 0) {
		temporary = n;
		n = m%n;
		m = temporary;
	}
	printf("%d", m);
4.Bonus-輸入一個包含年月份的日期,計算他是該年的第幾天(考慮閏年)
	int year, month, day, totalDay = 0;
	printf("請輸入 西元年 月 日(以空白分隔) >");
	scanf("%d %d %d", &year, &month, &day);

	/* 
		先判斷閏年
		閏年定義:年份為4的倍數且不為100的倍數,或者為400的倍數。
	*/
	int flag = 0; //閏年標記 0=不閏年, 1=閏年
	if(year%4 == 0 && year%100 != 0) {
		flag = 1;
	}

	if(year%400 == 0) {
		flag = 1;
	}

	/*
		檢查日期有沒有問題,我們設定條件
		1.不考慮西元前
		2.月份介於1~12
		3.日期不能超該月天數
	*/

	int error = 0; //如果三個參數有錯error被設為1
	if(year < 0 || month > 12 || month < 1) {
		error = 1;
	} else {
		if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month ==  12) {
			if(day > 31)
				error = 1;
		}
		if(month == 4 || month == 6 || month == 9 || month == 11) {
			if(day > 30)
				error = 1;
		}
		if(month == 2 && flag == 0) {
			if(day > 28)
				error = 1;
		}

		if(month == 2 && flag == 1) {
			if(day > 29)
				error = 1;
		}
	}

	/*
		1.先把month-1之前的天數算完
		2.再把該月的日期加上
	*/
	if(error == 0) {
		int i;
		for(i = 1;i < month;i++) {
			if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i ==  12) {
				totalDay += 31;
			}
			if(i == 4 || i == 6 || i == 9 || i == 11) {
				totalDay += 30;
			}
			if(i == 2 && flag == 0) {
				totalDay += 28;
			}

			if(i == 2 && flag == 1) {
				totalDay += 29;
			}
		}

		totalDay += day;

		printf("%d年%d月%d日是這一年的第%d天\n", year, month, day, totalDay);
	} else {
		printf("輸入的日期不支援\n");
	}

沒有留言:

張貼留言