18行代码解决:(C语言)L1-046 整除光棍 (20分)
立志用更少的代碼做更高效的表達
這里所謂的“光棍”,并不是指單身汪啦~ 說的是全部由1組成的數字,比如1、11、111、1111等。傳說任何一個光棍都能被一個不以5結尾的奇數整除。比如,111111就可以被13整除。 現在,你的程序要讀入一個整數x,這個整數一定是奇數并且不以5結尾。然后,經過計算,輸出兩個數字:第一個數字s,表示x乘以s是一個光棍,第二個數字n是這個光棍的位數。這樣的解當然不是唯一的,題目要求你輸出最小的解。
提示:一個顯然的辦法是逐漸增加光棍的位數,直到可以整除x為止。但難點在于,s可能是個非常大的數 —— 比如,程序輸入31,那么就輸出3584229390681和15,因為31乘以3584229390681的結果是111111111111111,一共15個1。
輸入格式:
輸入在一行中給出一個不以5結尾的正奇數x(<1000)。
輸出格式:
在一行中輸出相應的最小的s和n,其間以1個空格分隔。
輸入樣例:
31
輸出樣例:
3584229390681 15
解題思路
馬上就想到了大數除法, 覺得太麻煩了, 于是先用long long規模敲了一個暴力代碼,得了15分。如果是考試一定就撇下不做了。但對于訓練來講,還是要把對完美的代碼寫出來的。
仔細思考了下, 突然發現這又不是純粹的大數除法, 因為我們的除數固定的所有位數都為1。
因此,我們只需要保存每次操作的余數和除數, 每次固定*10+1做循環就可以了!
舉例:以輸入3為例,輸出為37 3,此時的“光棍”為111 。
除法過程:11/3=3 。11%3=2 。(2*10+1)/7=3 。(2*10+1)%7=0,停止操作,順序輸出3 7
代碼展示
#include<stdio.h> int main() {int n, len=0, p =0, now = 1;char ans[1005];scanf("%d", &n);while(1) {len++; //長度+1 if(p || now/n) ans[p++] = '0' + now/n;now %= n;if(now == 0) {ans[p] = '\0';printf("%s %d\n", ans, len);break;}now = now*10+1;} return 0; }每日一句
天空不會永遠陰暗,當烏云退盡的時候,藍天上燦爛的陽光就會照亮大地。青草照樣會鮮綠無比,花朵仍然會蓬勃開放。——《平凡的世界》
總結
以上是生活随笔為你收集整理的18行代码解决:(C语言)L1-046 整除光棍 (20分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9行代码满分 【C语言】 L1-062
- 下一篇: 满分简便代码——L1-049 天梯赛座位