學習了大概兩周的c語言基礎,今天終於進行了第一次做了乙個比較搞腦子的程式,雖然**是我自己乙個乙個敲的,但是,是在mooc上的c語言入門課做的反饋。
很多時候我覺得,學習**一定要自己手敲一遍,雖然手敲的速度非常的慢,但是我保證如果聽課的理解是50%,那麼手敲**會讓你理解80%,有人問還有20%去哪了,哈哈那就再實戰中獲取吧。
第一篇部落格,往往詞不達意,還望諒解。
接下來就開始複述我的整數分解的學習過程,很簡單啊!!!
首先呢,有幾個小要求,就是這個x必須是自主輸入的隨機的,因為這個原因我們是沒辦法直接從第一位開始獲取數字的,因為我們不知道最高位是多少,或許是十位百位or億億億億位哈哈哈。
所以這個程式的初步思想就是,我從末尾開始取咯,難道你還沒有末尾嗎?取出你的末尾,然後我再把你往前推一位,嗯,可以簡單的。於是程式就這樣出來了。scanf了乙個x進去。
//此處省略了輸入,輸入乙個已知的數x,將它的每一位倒序輸出
int t=0;//給定的0,做媒介的
dowhile(x>0); //只要x沒有被我們壓榨乾淨,我們就要繼續迴圈,直到把他的每一位都榨乾然後倒敘輸出
printf("x=%d,t=%d\n",x,t); //輸出
x = t; //這個t就是我們剛才倒敘輸出的數
do x/=10;
} while(x>0);
printf("\n"); //最後來乙個瀟灑的回車
感覺寫的挺好的啊,有興趣的同志複製黏貼一下就可以了,別忘了加上一些基礎要素。
好那麼是不是就是大功告成了呢,非也,因為編寫程式的時候還需要思考一些邊界條件也就是特殊情況,比如說我輸入1000會怎麼樣呢?最後的結果就是0,因為中間我們有乙個把位數往前推的過程,如果說剝離下來的位數是0,那麼0*10是毫無作用的。於是程式就出錯了。ok,那麼下一步就要改進,把這個0給保留下來。
先談談思路。如果我們能夠知道這個數有幾位數,是不是就方便多了,我們就從頭上開始,何必從尾巴開始呢。於是我們該怎麼獲取他的位數呢?ok你應該明白了,我就整除。
/*x=12345; 思路
12345/10000=1
12345%10000=2345
10000/10=1000
2345/1000=2
2345%1000=345
1000/10=100
345/100=3
345%100=45
100/10=10
45/10=4
45%10=5
10/10=1
5/1=5
5%1=5
1/10=0 */
所以:
int x;
scanf("%d",&x);
int mask = 10000;//這是乙個用來控制次數的變數。這裡我們先假設x都是萬級別的,已知輸入數字的數量級
dox%=mask; //問題出在這裡7000%1000=0!!!! 所以while的條件應該是mask為零,x零就零了唄
mask/=10;
printf("x=%d,mask=%d,d=%d\n",x,mask,d);
}while(x>0);//條件應該是mask>0
printf("\n"); 這套演算法的問題就是對於70000這種帶零的他沒法正確的輸出。
好,同樣思考乙個問題,迴圈結束的條件能不能是x>0的時候?
不能,因為如果這個x的值最後幾位就是0呢,不就又前功盡棄了嗎
這個**的缺點就是判斷條件還是用x來判斷,前面講過了,就算x沒有整除完,我x也可以0結尾,你能說我是除完了嗎,不能唄。
因此,判斷條件最好是用mask這個控制變數來控制。意思就是我的整除不受你x末尾是否為零影響,我只管你是幾位數!
int x;
scanf("%d",&x);
int mask = 10000; //假設這是乙個萬位的數
dox%=mask;
mask/=10;
//printf("x=%d,mask=%d,d=%d\n",x,mask,d);
}while(mask>0);
printf("\n"); //問題來了,能不能輸入多少,我的mask就是多少呢,能不能自動呢?
現在我們終於不用被零困擾了,那麼就要思考的高階一點了,是否可以我隨意輸入乙個數字,即使你不知道位數的大小呢?顯然是可以的。那就是我先對你的x進行處理。靠整除的次數來知道你的位數。
int x;
int t;
scanf("%d",&x);
t = x;
int mask = 1;
while(x>9)
x = t; //剛才的x被處理過一遍了,在賦值一遍
dox%=mask;
mask/=10;
//printf("x=%d,mask=%d,d=%d\n",x,mask,d); //檢測用的**
}while(mask>0);
printf("\n");
最後終於大功告成了。謝謝閱讀。 正序分解整數
1.前n項求和 f n 1 1 2 1 3 1 4 1 n intmain printf f d f n n,sum return0 2.f n 1 1 2 1 3 1 4 1 n int main printf f d f n n,sum return0 3.正序分解整數 輸入乙個非負整數,正序輸...
正序輸出整數
1 1 2 正序輸出整數的每一位數,數字之間用空格隔開 3123456 1 2 3 4 5 64 56 include 7 int pow int a,int b 8 9int main 10 while temp 0 23 24 分離出每一位數 25int digit 26 temp n 27do...
輸出整數字數,並正序,逆序輸出各個位上的值
題目 給乙個不多於5 位的正整數,要求 求出它是幾位數 分別輸出每一位數字 按逆序輸出各位數字,例如原數為321,應輸出123。一般來說,統計整數的位數有兩種方法 1.使用if和else if將情況列舉出來 2.每次丟棄個位,利用n 10迴圈使用 int main while n 0 printf ...