#12133: 為何在這出錯


k963852741 (啓揚)

學校 : 臺中市立東山高級中學
編號 : 60198
來源 : [140.128.173.197]
最後登入時間 :
2018-11-24 12:16:59
d213. 长寿的兔子 -- 著名题目 | From: [111.67.53.131] | 發表日期 : 2017-06-04 16:57

#include<iostream>
#include<math.h>
using namespace std;

int main(){
    long long int a,b,c;
 while(cin>>b){
  c=pow(2,b+2)-2;
  for(int i=1;i+9<b;i++){
   c-=pow(2,i+1);
  }if(b>=10){
   c-=2;
  }
  cout<<c<<endl;
 }
 return 0;
}

為何在第54筆測資發生少2的現象

 
#12136: Re:為何在這出錯


who_am_I (kruztw)

學校 : 國立臺灣師範大學
編號 : 54056
來源 : [36.224.144.147]
最後登入時間 :
2023-04-22 22:46:31
d213. 长寿的兔子 -- 著名题目 | From: [140.122.36.52] | 發表日期 : 2017-06-04 22:06

#include
#include
using namespace std;

int main(){
    long long int a,b,c;
 while(cin>>b){
  c=pow(2,b+2)-2;
  for(int i=1;i+9<b;i++){
   c-=pow(2,i+1);
  }if(b>=10){
   c-=2;
  }
  cout<<c<<endl;
 }
 return 0;
}

為何在第54筆測資發生少2的現象


  for(int i=1;i+9<b;i++)
   c-=pow(2,i+1);

 

這裡出現問題

你可以看看它減的量

當 i = 1時 它只有減2

 

for(i=1; i+9 < b; i++)

{

       cout << "before:" << c << endl;

       c -= pow(2, i+1);

       cout << "after:" << c << endl;

        getch();  //#include <conio.h>

 }

 

我在猜想可能是數字太大的關係

導致底層發生某些錯誤

什麼錯誤呢?

我也不知道

只能告訴你錯在哪

如果版上有人知道

還煩請不吝賜教

 

如果有幫到忙

還希望能幫我衝衝人氣><

謝謝

http://ntnuee40475032h.pixnet.net/blog

  



 
#12231: Re:為何在這出錯


k963852741 (啓揚)

學校 : 臺中市立東山高級中學
編號 : 60198
來源 : [140.128.173.197]
最後登入時間 :
2018-11-24 12:16:59
d213. 长寿的兔子 -- 著名题目 | From: [210.209.249.174] | 發表日期 : 2017-06-16 23:12

#include
#include
using namespace std;

int main(){
    long long int a,b,c;
 while(cin>>b){
  c=pow(2,b+2)-2;
  for(int i=1;i+9<b;i++){
   c-=pow(2,i+1);
  }if(b>=10){
   c-=2;
  }
  cout<<c<<endl;
 }
 return 0;
}

為何在第54筆測資發生少2的現象


  for(int i=1;i+9<b;i++)
   c-=pow(2,i+1);

 

這裡出現問題

你可以看看它減的量

當 i = 1時 它只有減2

 

for(i=1; i+9 < b; i++)

{

       cout << "before:" << c << endl;

       c -= pow(2, i+1);

       cout << "after:" << c << endl;

        getch();  //#include

 }

 

我在猜想可能是數字太大的關係

導致底層發生某些錯誤

什麼錯誤呢?

我也不知道

只能告訴你錯在哪

如果版上有人知道

還煩請不吝賜教

 

如果有幫到忙

還希望能幫我衝衝人氣><

謝謝

http://ntnuee40475032h.pixnet.net/blog

  



i=1時 不是減2^(1+1)=4嗎?


 
#12249: Re:為何在這出錯


zeoj (unknown)

學校 : 臺中市私立立人高級中學
編號 : 66741
來源 : [210.60.247.91]
最後登入時間 :
2017-09-28 09:27:06
d213. 长寿的兔子 -- 著名题目 | From: [210.60.247.95] | 發表日期 : 2017-06-19 16:26

#include
#include
using namespace std;

int main(){
    long long int a,b,c;
 while(cin>>b){
  c=pow(2,b+2)-2;
  for(int i=1;i+9<b;i++){
   c-=pow(2,i+1);
  }if(b>=10){
   c-=2;
  }
  cout<<c<<endl;
 }
 return 0;
}

為何在第54筆測資發生少2的現象

1.程式碼產生了型別的益位   long long int , 會不足    題目說會到2的62次方  所以  應用  unsigned long long int

2.為何在第54筆測資發生少2的現象<== 有興趣可以去看一下pow的原型吧

若只求2的次方,  其實用位元位元移位運算子 << 就可以了 , 比pow好用多了

例如: 

unsigned long long int ts(int n){

  unsigned long long int n2=1;

     return n2<<n;

    }

3.不過你還是會發現, 這樣也會有錯, 因為你的程式計算過程中

 while(cin>>b){

  c=pow(2,b+2)-2;

有看出來了嗎 若b 為62時  就會產生溢位了 , 所以 你的方法無法滿足 n=62 只能算到n<62

其實你可以換個方向思考, 開個63的陣列

把每年新增的兔子放到陣列 最後在去加總

 



 
ZeroJudge Forum