1. 程式人生 > 其它 >PTA天梯賽L1-046 整除光棍

PTA天梯賽L1-046 整除光棍

我男神出的,並且題目質量還是有的,拿來講講吧

題目連結:https://pintia.cn/problem-sets/994805046380707840/problems/994805084284633088

話說這個題對光棍們||單身狗們可不太友好啊嗚嗚嗚

首先拿到題目,打眼一看,這個數字用long long 大概率是存不下了;

所以對於目前的選擇有兩種表示辦法:

一、選擇用高精度除法來表示這龐大的資料

但是用高精度太麻煩了,高精度除低精度還比較好說,但是高精度除以高精度的演算法是一個很麻煩的演算法,(其實高精度的演算法都很麻煩),

二、構造優化演算法,實現在沒有儲存大量資料的前提下對資料進行優化

這種演算法是有的,並且都不能被稱之為演算法,我將其稱之為-小學除法模擬;

哈哈哈,很簡單吧

你可以看一下啊,這個題是111111111111....除以n,拿題目給的3l來舉例,我們簡單畫一下(手算)一下就好了呀

可以看到,對於每次除完之後,餘數*10+1正好可以構成下一次除法的被除數,直到可以被整除,而這期間每次由被除數除以除數(n)所得出的數字每次都輸出恰巧就是我們所要得到的結果

神奇吧,其實這就是小學除法,模擬一下就好了,不得不說,翁老師對於題目的構造還是很精巧的

我先前的錯誤程式碼(沒有認識到資料的龐大性,後來想到了):

 1 #include<bits/stdc++.h>//天梯賽整除光棍錯誤程式碼 
 2 using namespace std;
 3 int x;
 4 long long ans=1;
 5 int cnt;
 6 int main()
 7 {
 8     std::ios::sync_with_stdio(false);
 9     cin>>x;
10     while(1)
11     {
12         ans=ans*10+1;
13         if(ans%x==0)
14         break; 
15     }
16     long long res=ans/x;
17     long long temp=ans;
18     while(temp)
19     {
20         temp/=10;
21         cnt++;
22     }
23     cout<<res<<" "<<cnt;
24     return 0;
25 } 

 

下面附上參考程式碼以及注意事項:

#include<bits/stdc++.h>//pta 整除光棍,可以講講 
using namespace std;
int x;
int cnt=1;//位數 
int res=1;//初始值設1 
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>x;
    while(res<x)
    {
        res=res*10+1;//先要等到可以進行除法運算的時候在進行除法運算 
         cnt++;//位數加一 
    }
    while(1
) { cout<<res/x;//每次模擬輸出商 res=res%x;//進行取餘 if(res%x==0)//如果是整除就表明除法運算結束 break; res=res*10+1;//餘數*10+1構造為被除數 cnt++;//位數加一 } cout<<" "<<cnt; return 0; }