整數分解並正序輸出 C語言

2021-09-13 21:32:50 字數 2550 閱讀 8991

學習了大概兩周的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 ...