Time Limit Exceed,即超時,主要可能是輸入輸出時邏輯不對或程式碼邏輯中存在死迴圈。
不幸你程式碼中這兩個原因都存在:
首先題目中已經明確說明第一行是T,即T只會輸入一次,無需用while(scanf("%d",&T)!=EOF),否則可能導致輸入超時, 改成 scanf("%d", &T);
然後主迴圈中沒有考慮特殊情況,比如如果m為偶數或m的尾數為5則不存在n個1組成的數字是m的倍數,在你程式碼中就是死迴圈了;
再然後,就算不是特殊情況,n也可能很大,比如k=1237時n=206,int型的m根本儲存不了,會發生多次溢位,一旦溢位則也可能造成死迴圈。
可以參考如下程式碼:
#include <stdio.h>int main(){ int c, n, m, r, p; scanf("%d", &c); while(c--) { scanf("%d", &m); if(!(m&1) || (m%10==5)) { printf("-1\n"); continue; } p = 1; r = 1; n = 1; while(r%m != 0) { p = p*10%m; r = (r+p)%m; n++; } printf("%d\n", n); } return 0;}
Time Limit Exceed,即超時,主要可能是輸入輸出時邏輯不對或程式碼邏輯中存在死迴圈。
不幸你程式碼中這兩個原因都存在:
首先題目中已經明確說明第一行是T,即T只會輸入一次,無需用while(scanf("%d",&T)!=EOF),否則可能導致輸入超時, 改成 scanf("%d", &T);
然後主迴圈中沒有考慮特殊情況,比如如果m為偶數或m的尾數為5則不存在n個1組成的數字是m的倍數,在你程式碼中就是死迴圈了;
再然後,就算不是特殊情況,n也可能很大,比如k=1237時n=206,int型的m根本儲存不了,會發生多次溢位,一旦溢位則也可能造成死迴圈。
可以參考如下程式碼:
#include <stdio.h>int main(){ int c, n, m, r, p; scanf("%d", &c); while(c--) { scanf("%d", &m); if(!(m&1) || (m%10==5)) { printf("-1\n"); continue; } p = 1; r = 1; n = 1; while(r%m != 0) { p = p*10%m; r = (r+p)%m; n++; } printf("%d\n", n); } return 0;}