2015年8月10日 星期一

[C][瘋狂程設][04_分支] A017:三角形種類

A017:三角形種類


三角形種類

輸入為三角形三邊長(正整數) a b c,輸出三角形類型(英文)
 isosceles triangle(等腰三角形)
 not a triangle(不成三角形)
 regular triangle(正三角形)
 rectangular triangle(直角三角形)
 obtuse triangle(鈍角三角形)
 acute triangle(銳角三角形)
 isosceles righttriangle(等腰直角三角形)

Input

 1 1 5

Output

not a triangle

Notes:


1.先將三角三個邊長做排序:

2.判別不成三角形,若邊長無法構成三角形,則程式結束:

 //situation:not a triangle
 if(side1+side2<=side3){
  printf("not a triangle");
  return 0;
 } 

3.先判別正三角形或等腰三角形,若為等腰三角形,則程式結束,不需要辨別是鈍角或銳角

 //situation:regular or isosceles
 if((side1==side2) && (side2==side3)){
  printf("regular triangle");
  return 0;
 }else if((side1==side2) || (side2==side3)){
  printf("isosceles triangle");
  return 0;
 }

4.判別鈍角、銳角、直角三角形

int test_side_square(int *a,int *b,int *c){

 int value,a2=(*a)*(*a),b2=(*b)*(*b),c2=(*c)*(*c);;
 
 //value=0, means: rectangular triangle(直角三角形)
 //value=1, means: obtuse triangle(鈍角三角形) 
 //value=-1,means: acute triangle(銳角三角形)
 (c2==(a2+b2))?(value=0):(c2>(a2+b2))?(value=1):(value=-1);
 
 return value;
}

5.若為直角三角形,則需要進一步辦別是否具有等腰性質:

 //situation:obtuse or acute;rectangular or isosceles righttriangle,
 result=test_side_square(&side1,&side2,&side3); 
 if(result!=0){
  (result<0)?printf("acute triangle"):printf("obtuse triangle");
 }else{
  (side1==side2)?printf("isosceles righttriangle"):printf("rectangular triangle");
 }

Code:

#include <stdio.h>

void swap(int *a,int *b){
 if(*a>*b){
  *a^=*b;
  *b^=*a;
  *a^=*b;
 }
}

int test_side_square(int *a,int *b,int *c){

 int value,a2=(*a)*(*a),b2=(*b)*(*b),c2=(*c)*(*c);;
 
 //value=0, means: rectangular triangle(直角三角形)
 //value=1, means: obtuse triangle(鈍角三角形) 
 //value=-1,means: acute triangle(銳角三角形)
 (c2==(a2+b2))?(value=0):(c2>(a2+b2))?(value=1):(value=-1);
 
 return value;
}

int main(void){

 int side1,side2,side3,result;
  
 scanf("%d %d %d",&side1,&side2,&side3);
 //printf("%d %d %d",side1,side2,side3);

 //sort the length of side
 swap(&side1,&side2);
 swap(&side2,&side3);
 swap(&side1,&side2);

 //situation:not a triangle
 if(side1+side2<=side3){
  printf("not a triangle");
  return 0;
 } 

 //situation:regular or isosceles
 if((side1==side2) && (side2==side3)){
  printf("regular triangle");
  return 0;
 }else if((side1==side2) || (side2==side3)){
  printf("isosceles triangle");
  return 0;
 }
 
 //situation:obtuse or acute;rectangular or isosceles righttriangle,
 result=test_side_square(&side1,&side2,&side3); 
 if(result!=0){
  (result<0)?printf("acute triangle"):printf("obtuse triangle");
 }else{
  (side1==side2)?printf("isosceles righttriangle"):printf("rectangular triangle");
 }
 
 return 0;
}


[C][瘋狂程設][04_分支] A016:三數排序

A016:三數排序


三數排序

輸入三個正整數a、b、c,將a、b、c從小排到大。
鍵詞
<:鍵詞 至少=0 最多=1 擁有=9999>include<:>
<:鍵詞 至少=0 最多=0 擁有=9999>[<:>
<:鍵詞 至少=0 最多=0 擁有=9999>]<:>

Input

192 706 184 

Output

184 192 706

Notes:


1.兩數字比較大小,數字小的在前面,數字大的在後面

利用邏輯運算子,若數字小的在後面,則將兩個數字互換
void swap(int *a,int *b){
 if(*a>*b){
  *a^=*b;
  *b^=*a;
  *a^=*b;
 }
}

2. 先將數字1數字2比較,再將數字2與數字3比較,最後數字1與數字2再比一次,確保最小的數字在第一個

 swap(&num1,&num2);
 swap(&num2,&num3);
 swap(&num1,&num2);

Code:

#include <stdio.h>

void swap(int *a,int *b){
 if(*a>*b){
  *a^=*b;
  *b^=*a;
  *a^=*b;
 }
}

int main(void){

 int num1,num2,num3;

 scanf("%d %d %d",&num1,&num2,&num3);
 
 swap(&num1,&num2);
 swap(&num2,&num3);
 swap(&num1,&num2);

 printf("%d %d %d",num1,num2,num3);
 return 0;
}

[C][瘋狂程設][02_變數與型別] F007:輸入ASCII及字元顯示

F007:輸入ASCII及字元顯示


輸入一個ASCII數字,輸出數所代表之字元及ASCII碼,再輸出ASCII表上的下一個字元及其ASCII碼

Input

117

Output

u:117↵\r\n
v:118

Notes:


1.字元與ASCII的表示方式

這題花很多間在想字元與ASCII的表示方式,
input的給是數字,一開始因為這個混淆了很久。

到底型別要用char還是int? 
最後幾次測試還有google的結果:型別採用int即可!!
要顯示字元,就用"%s",要顯示ASCII,就用"%d"

當int的數字用%s顯示,就可以印出該ASCII所代表的文字,
ASCII code的數字+1,就可以印出下一個字。
printf("%s:%d\n",&input,input);

2.ASCII的相關資訊

https://zh.wikipedia.org/zh-tw/ASCII

3.重要的ASCII code

32:space
48:0
49:1
65:A
97:a

Code:

#include 

int main(void){

 int input=0,next=0;
 
 scanf("%d",&input);
 printf("%s:%d\n",&input,input);
 
 next = input+1;
 printf("%s:%d",&next,next);
 
 return 0;
 
}

[C][瘋狂程設][02_變數與型別] A014 次方求餘

A014 次方求餘


輸入三個正整數 n p d,輸出(n^p)%d,即 n 的 p次方 對 d的餘數。 

Input

 59 89 80 

Output

  
59

Notes:


1.這題看似簡單,卻包含一個數學陷阱。簡單的求餘數不難,但是這題有個小陷阱,就是"次方",取次方可能會出現極大數字,造成溢位。

因此利用迴圈處理次方的運算,每次迴圈當中,持續將每次增加的底數去餘數,之後再取一次餘數,利用這個方式避免溢位。
例如:

5%3 = 2
25%3 = 1

(5*5)%3  = (5*(5%3))%3
         = (5*2)%3  
         = 10%3=1

while(i<index){
  remider=(remider*(base%divisor))%divisor;
  i++;
 }

Code:

#include >stdio.h<

int main(void){

 int base=0,index=0,divisor=0,remider=1,i=0;
 
 scanf("%d %d %d",&base,&index,&divisor);

 while(i<index){
  remider=(remider*(base%divisor))%divisor;
  i++;
 }
 
 printf("%d",remider);

 return 0;
}