我正在撰寫一個程式來找到最小的數字m僅由數字“1”組成,該數字可以除以給定的數字n。n必須是 10 的互質數。
例如:
- n = 37 -> m = 111 (111/37 =3)
- n = 11 -> m = 1111 (1111/11 = 101)
- n = 91 -> m = 111111 (111111/91 = 1221)
我當前的代碼:
#include <bits/stdc .h>
using namespace std;
int main()
{
long long int n, m = 1;
cin>>n;
while (m % n != 0) {
m = m*10 1;
}
cout<<m;
}
我相信這是找到 m 的正確方法,但它遇到了 TLE (超出時間限制)問題,我認為這是因為:
- 代碼需要太多回圈才能找到滿足條件的數字m 。
- 沒有滿足條件的數m 。
有沒有辦法避免這個程式的 TLE 問題?無論如何,是否可以根據n在數學上找到m,或者那個數字m不存在?
我找到了 Time Limit Exceeded 錯誤的解決方案。
解決方案是將 while 回圈中的步驟減少到:
while(m%n!=0)
{
m=(m*10 1)%n;
cout<<"1";
}
盡管這個問題得到了解決,但我仍然對在數學上找到m的方法(或確定m是否存在)感到好奇,因此任何其他有關此的輸入都值得贊賞。
uj5u.com熱心網友回復:
對于您找到的新版本,如果您計算的新版本之前已經遇到過,您可以確定沒有解決方案m- 這意味著您處于無限回圈中。
但是,由于快取以前的值m對于這個問題的范圍來說可能太多了,你可以求助于較弱的條件:如果回圈運行n多次 - 因為m總是小于n,這意味著至少一個m值必須有已經重復了。
#include <bits/stdc .h>
using namespace std;
int main()
{
unsigned long int n = 12, m = 1;
unsigned int count = 0;
string result = "1";
while(m%n!=0 && count < n){
m=(m*10 1)%n;
result = result "1";
count ;
}
cout << (m%n == 0 ? result : "no result") << endl;
}
條件較弱,因為你后來發現沒有解決方案,但結果仍然是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507872.html
下一篇:用char代替 -*/的數學運算
