2016年10月9日 星期日

C語言 螺旋矩陣 功課 struct

剛好資料結構出的功課又來寫了一次
struct裡面宣告方法真是機掰,有夠麻煩我還到藍色小舖發問
http://www.blueshop.com.tw/board/FUM20050124191259IGD/BRD20161006215125N33.html

這題是螺旋矩陣
原本以前寫過一次之後再寫,可是覺得寫得太醜了
所以參考一下別人的https://tw.answers.yahoo.com/question/index?qid=20120508000016KK09872
可是中間個那個ax,ay轉換實在是有點亂,所以改了一個易懂的用r[4][2]
以順時針的來就是先走J再走I然後走-J最後走-I
-I走完還要用下一個陣列是否為0來判斷,是否該轉向

#include <stdio.h>
#include <stdlib.h>
#define N 10

struct SpiralMaxtrix
{
int n;
int maxtrix[N][N];
void (*ShowMatrix)(struct SpiralMaxtrix A); /*ShowMatrix是函式指標*/
void (*ShowMatrixR)(struct SpiralMaxtrix A); /*ShowMatrixR是函式指標*/
}A;

void func_ShowMatrix(struct SpiralMaxtrix A)
{
int i=0,j=0,num=1,temp;
int iy=0,jx=0,a=0;
int r[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
while(num<=A.n*A.n){
A.maxtrix[i][j]=num;
iy=i+r[a%4][0];
jx=j+r[a%4][1];
if(iy<0||iy>=A.n||jx<0||jx>=A.n||A.maxtrix[iy][jx]!=0){
a++;
}
i+=r[a%4][0];
j+=r[a%4][1];
num++;
}
for(i=0;i<A.n;i++){
for(j=0;j<A.n;j++){
printf("%-3d",A.maxtrix[i][j]);
}
printf("\n");
}
}

void func_ShowMatrixR(struct SpiralMaxtrix A)
{
int i=0,j=0,num=1,temp;
int iy=0,jx=0,a=0;
int r[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
while(num<=A.n*A.n){
A.maxtrix[i][j]=num;
iy=i+r[a%4][0];
jx=j+r[a%4][1];
if(iy<0||iy>=A.n||jx<0||jx>=A.n||A.maxtrix[iy][jx]!=0){
a++;
}
i+=r[a%4][0];
j+=r[a%4][1];
num++;
}
for(i=0;i<A.n;i++){
for(j=0;j<A.n;j++){
printf("%-3d",A.maxtrix[i][j]);
}
printf("\n");
}
}

int main(int argc, char *argv[])
{
A.ShowMatrix=func_ShowMatrix; /*使用前要先把指標指向真實的函數*/
A.ShowMatrixR=func_ShowMatrixR;
printf("請輸入n:");
scanf("%d",&A.n);
printf("順時針印出:\n");
A.ShowMatrix(A);
printf("逆時針印出:\n");
A.ShowMatrixR(A);
return 0;
}

2016年1月21日 星期四

d649: 數字三角形

內容 :
 小米是個喜歡畫三角形的小朋友
 上課時小米覺得無聊都會在課本的一角畫三角形
 首先畫了
 *
 接著是
 *
 **
 再來
 *
 **
 ***
 就這樣一直畫到下課
 但是這樣太簡單而且太無聊了
 小米想:為何我不向右對齊呢?
 但就在下一節課小米嘗試畫出新三角形時
 小米怎麼樣也沒辦法向右對齊

 就請大家幫小米這個忙吧!
輸入說明 : 
 輸入一數字 N (0 ≤ N ≤ 1000)
 代表小米想畫出高度為 N 的三角形
 當 N 為 0 時結束程式,不需處理這行輸入
輸出說明 : 
 請輸出一個高為 N ,底也為 N 的三角形
 每組輸出請用空行隔開
 空白請用 '_' 代替
 星號請用 '+' 代替
範例輸入 : help
3
5
0
範例輸出:
__+
_++
+++

____+
___++
__+++
_++++
+++++
提示 : 
 ¤ 雙層迴圈練習題
 ¤ 有問題盡量問,這裡不是知識+不會扣點XD (雖然回答也沒有解答贈點)
 ¤ 小挑戰: 你可以用一個字元陣列解決問題嗎?
 ¤ 因應 JAVA 使用者將每測資點時限改為 10 s 並修改測資 (感謝 liouzhou_101)
 ¤ 2010/07/13 修改測資,並重測
標籤:
出處: 


import java.util.Scanner;

public class d649 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
if(n==0) break;
for(int i=0;i<n;i++){
for(int j=n-1;j>i;j--){
System.out.print("_");
}
for(int k=0;k<=i;k++){
System.out.print("+");
}
System.out.println();
}
}

}

}

d693: 最小公倍數

內容 :
 這題並不是要你算兩個數的最小公倍數,
 因為大家都知道:
      ( from wiki )
 It is too easy!
 想請大家算出 n 個數的最小公倍數! 
輸入說明 : 
 每組測試資料兩行
 第一行有一整數 N ( 2 ≤ N ≤ 10 )
 第二行包含 N 個正整數 ( 每個數 ≤ 100 )
 當 N 為 0 時請結束程式 
輸出說明 : 
 每組測試資料輸出一行
 請輸出 N 個正整數的最小公倍數
 答案保證小於 231-1 
範例輸入 : help
2
3 5
0
範例輸出:
15
提示 : 
 ¤ 感謝 asas 指正範例測資的錯誤
標籤:
出處: 
(管理:example)


import java.util.Scanner;

public class d693 {                                    //兩兩公倍數 相乘

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();   
if(n==0) break;
            double a,answer=1;
   for(int i=0;i<n;i++){
  a=sc.nextDouble();
  answer=answer*a/GCD(a,answer);   
   }    
   System.out.println((int)answer);    
}
}
static double GCD(double a,double b){
if(a%b==0)
return b;
else
return GCD(b,a%b);
}

}

2016年1月19日 星期二

d827: 買鉛筆

內容 :
鉛筆一支 5 元,一打 50 元。小明需要幫班上每位同學買一枝鉛筆,請問要多少錢?由於小明很注重環保,他絕不會為了省錢而多買任何不需要的東西。也就是說,小明買的鉛筆數量一定等於班上的人數。
輸入說明 : 
輸入只有一行,含有小明班上的人數 n,1 ≤ n ≤ 200。
輸出說明 : 
請輸出一個數字,代表這次採購的金額。
範例輸入 : help
42
範例輸出:
180
提示 : 
標籤:
出處: 


import java.util.Scanner;

public class d827 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
System.out.println(n/12*50+n%12*5);
}

}

}

d881: 作業苦多

內容 :
學校作業何其多~~老二為此苦惱了許久,現在又有一份數學作業,他想節省時間,所以想找一個程式來解決此問題,你能幫嗎?詳細題目如下:
計算一級數
每項的差形成一個等差數列
每一題給定一等差數列的公差
此等數列有50項,第一項為1
輸出此數列和(1+到50項)
例如輸入為1(此為各項差形成的等差級數的公差) 
答案要輸出1+2+4+7+11+......(到50項) 
若輸入為2
答案要輸出1+2+5+10+17+26+37...... (到五十項)
輸入說明 : 
每次輸入一個測資d,代表公差(d<=100)
輸出說明 : 
輸出級數和(1+到50項)
範例輸入 : help
1
範例輸出:
20875
提示 : 
標籤:
出處: 
CSDC (管理:leepupu)


import java.util.Scanner;

public class d881 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
long total=1;
int n=sc.nextInt(),a=1;
for(int i=2,j=1;j<50;i+=a,j++){
total+=i;
a+=n;
}
System.out.println(total);
}

}

}

d984: 棄保效應

內容 :
台灣的選舉法令禁止各陣營及媒體在投票日前的一個星期內公佈民調結果,其中最重要的一個因素是要避免「棄保效應」。所謂的「棄保效應」是指選民在得知自己所支持的候選人當選無望時,有可能會把票投給其他比較可能當選的人,以免浪費了自己的一票。假設某選舉有三位候選人來競選一個職位,在「棄保效應」發揮到極致的情形下,所有民調第三名的候選人的支持者都會把票投民調第二名的候選人,也就是他們都會「棄三保二」。給你 A, B, C 三個候選人的支持者人數,請判斷誰會當選?
輸入說明 : 
輸入有若干筆測試資料,每筆一行。每行有三個以空白隔開的整數 a, b, c 代表候選人 A, B, C 的支持者人數,0 ≤ a, b, c ≤ 2147483647。你可以假設在「棄保效應」之後,不會有相同票數的情形發生。
輸出說明 : 
請輸出將會當選的人是 A, B 或 C。
範例輸入 : help
3 4 5
1 3 5
範例輸出:
B
C
提示 : 
標籤:
出處: 


import java.util.Scanner;

public class d984 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
long a=sc.nextLong(),b=sc.nextLong(),c=sc.nextLong();
if(a>b && a>c){
if(a>b+c)
System.out.println("A");
else{
System.out.println(b>c?"B":"C");
}
}
else if(b>a && b>c){
if(b>a+c)
System.out.println("B");
else{
System.out.println(a>c?"A":"C");
}
}
else{
if(c>b+a)
System.out.println("C");
else{
System.out.println(a>b?"A":"B");
}
}
}

}

}

2016年1月15日 星期五

d623: 反方陣

內容 :
11
輸入說明 : 
輸入有兩行每行有2個數字代表2階方陣
輸入4個0表示結束
輸出說明 : 
輸出此方陣的反方陣
若此方陣無反方陣則輸出cheat!
範例輸入 : help
1 2
3 4
1 1
1 1
0 0
0 0
範例輸出:
-2.00000 1.00000
1.50000 -0.50000
cheat!
提示 : 
標籤:
出處: 
leopan0922 (管理:leopan0922)


import java.util.NoSuchElementException;
import java.util.Scanner;

public class d623 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
try{
while(sc.hasNext()){
double a=sc.nextDouble(),b=sc.nextDouble(),c=sc.nextDouble(),d=sc.nextDouble();
double temp=1/(a*d-b*c);
if(a==0 && b==0 && c==0 && d==0)
break;
else if(temp==0)
System.out.println("cheat!");
else
System.out.printf("%.5f %.5f\n%.5f %.5f\n",d*temp,-b*temp,-c*temp,a*temp);
}
}catch(NoSuchElementException ex){}

}

}