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);
	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");
	}
 
沒有留言:
張貼留言