Board logo

標題: d058: BASIC 的 SGN 函數 [打印本頁]

作者: buy    時間: 2010-10-30 08:51     標題: d058: BASIC 的 SGN 函數

內容 : 正體->简体
在 BASIC 語言中有一個 SGN 函數,(VB .Net 改成 Math.Sign),它會根據參數的正負號傳回 1, 0, 或 -1。請你寫一個程式來模仿這個函數,給你一個整數 n,若 n > 0 請輸出 1,若 n = 0 請輸出 0,若 n < 0 請輸出 -1。
輸入說明 :
輸入只有一行,其中含有一個整數。
輸出說明 :
依題目說明,請輸出 1、0、或 -1。
範例輸入 :

-9
範例輸出 :

-1
提示 :
你能只用關係運算子及算術運算子來求出解答,而不需要用到 if 指令嗎?
作者: Alen    時間: 2010-10-30 10:21

回復 1# buy
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. int main(void){

  5.    int i;
  6.    
  7.    while (cin >> i){
  8.          if (i > 0){
  9.             cout << "1" << endl;   
  10.          }else if (i == 0){
  11.                   cout << "0" << endl;     
  12.           }else if (i < 0){
  13.                    cout << "-1" << endl;      
  14.           }      
  15.    }
  16.    //system("pause");
  17.    return 0;
  18. }
複製代碼

作者: chuangjoy    時間: 2010-10-30 10:23

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.    
  5.     int a;
  6.     while(cin >> a){
  7.               if(a > 0){
  8.                    cout << "1" << endl;
  9.               }else if(a == 0){
  10.                     cout << "0" << endl;
  11.               }else if(a < 0){
  12.                     cout << "-1" << endl;
  13.               }
  14.     }
  15.    
  16. return 0;
  17. }
複製代碼

作者: abc3806198    時間: 2010-11-6 09:22

  1. #include <iostream>
  2. using namespace std;
  3. int main(){

  4.     int a;
  5.     while(cin >> a){
  6.               if(a > 0){
  7.                    cout << "1" << endl;
  8.               }else if(a == 0){
  9.                     cout << "0" << endl;
  10.               }else if(a < 0){
  11.                     cout << "-1" << endl;
  12.               }
  13.     }

  14.      return 0;

  15. }
複製代碼

作者: b1081081    時間: 2010-11-13 10:27

  1. #include <iostream>
  2. using namespace std;
  3. int main(){

  4. int a;
  5. cin >> a;
  6. if(a > 0){
  7. cout << 1 << endl;
  8. }else if(a == 0){
  9. cout << 0 << endl;
  10. }else{
  11. cout << -1 << endl;


  12. }









  13. return 0;
  14. }
複製代碼

作者: ray    時間: 2011-11-11 11:54

不能使用if指令的做法:

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
       //處理負數(正數及0在這邊變成0)
       int a = (n&2147483648UL)|(4294967295UL*((n&2147483648UL)/2147483648UL));
       //處理正數及0(負數在這邊變成0)
       int b = (((n&2147483648UL)/2147483648UL)^1)*(!!n);
       //上面兩個結果相加就是答案!
       cout << static_cast<int>(a+b) << endl;
       //只需要一行程式的寫法:
       //cout << static_cast<int>((((n&2147483648UL)|(4294967295UL*((n&2147483648UL)/2147483648UL)))+(((n&2147483648UL)/2147483648UL)^1))*(!!n)) << endl;
    }
    return 0;   
}
作者: ray    時間: 2011-12-3 11:02

使用C內建的常數可以讓程式更清楚且可以避免不同編譯器的int型別資料大小不同導致的錯誤:

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
       //處理負數(正數及0在這邊變成0)
       int a = (n&(INT_MAX+1))|((INT_MAX*2+1)*((n&(INT_MAX+1))/(INT_MAX+1)));
       //處理正數及0(負數在這邊變成0)
       int b = (((n&(INT_MAX+1))/(INT_MAX+1))^1)*(!!n);
       //上面兩個結果相加就是答案!
       cout << static_cast<int>(a+b) << endl;
       //只需要一行程式的寫法:
       //cout << static_cast<int>((((n&(INT_MAX+1))|((INT_MAX*2+1)*((n&(INT_MAX+1))/(INT_MAX+1))))+(((n&(INT_MAX+1))/(INT_MAX+1))^1))*(!!n)) << endl;
    }
    return 0;   
}




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2