身為oi初心者,顯然道阻且長,途中遇到很多問題,所謂的問題,是自身能力的缺陷所在,應予以必要之修正。
本題為角谷猜想(1.5.21),題干是這樣的:
對於任意一個正整數,如果是奇數,則*3+1,如果是偶數,則/2,得到的結果再按上述規則重復處理,最終能得到1。如,假定初始整數為5,計算過程分別為16、8、4
2、1。 要求:程序要求輸入一個整數,將經過處理得到的1輸出來。最后一行輸出「end」。如果輸入為1,直接輸出「end」。
思路:首先,大致地審完題,明題意。對於輸入的是奇數是偶數,顯然要使用條件語句,然后所謂的規則重復處理,而是循環控制,至於是for循環還是while循環,題干
中出現了對於奇數或是偶數的如何操作的條件,我們選擇while循環 ,基本結題框架就布置ok了。在微觀分析,題干中說得到的結果再按上述規則重復處理再根據后面的
假定整數為5以及其計算過程,我們可以了解到角谷猜想的含義,特別之處奇數,當輸入的為奇數時,再*3+1那就成為偶數了,便按照規則要/2,再繼續下去在商成為1之
前一直是偶數。
放代碼:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int main(){ 6 int a; 7 cin>>a; 8 if (a % 2 == 0 ){ 9 while (a != 1){ 10 a /= 2.0; 11 printf("%d\n",a); 12 } 13 cout<<"END"<<endl; 14 15 }else if (a % 2 != 0){ 16 a = 3 * a + 1; 17 while (a != 1){ 18 a /= 2.0; 19 printf("%d\n",a); 20 } 21 cout<<"END"<<endl; 22 }else{ 23 cout<<"END"<<endl; 24 } 25 26 return 0; 27 }
(ps 那個除數可以不是2.0)
我們要着重講這個呢?原因是,由於我的思維的不嚴謹,導致以為是奇數時就要一直*3+1,結果導致溢出,當時還沒察覺到,到現在才明白,審題的重要性,理解概念,明題意,所謂的明題意就是
考查的是什么,題干的大概意思是什么,構成在解題之前的思路框架。因此要細心讀題,知道那句話什么意思。