Re: [問題] 有關ACM10994

看板C_and_CPP (C/C++)作者 (傲笑蒼鷹)時間16年前 (2009/03/08 23:56), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《h3615840 (傲笑蒼鷹)》之銘言: : 我想請問有關ACM10994的問題 : 題目是有給兩個函數: : F(n) = n%10 if(n%10)>0 : 0 if n = 0 : F(n/10) Otherwise : S(p,q) = F(i) i從p到q所有函數連加 : 這題起初我是用迴圈來做 : 起初先依照公式將p值帶入計算加總 : 直到p值成為10的倍數時 : 再看與Q的差距,決定是否以10或100加總跳動 : 不過由於出現個1 2147483647的資測 : 所以測試還是TLE : 現在的想法是想說利用數學關係式來解 : 如果是p=1;q=100時 : 就(100/10)*45+(10/10)*45+1 : (若最後項不為1則從1開始加到該項) : 可是遇到起始不為1時似乎就不能用 : 請問這樣的想法是有錯嗎?還是說有少了什麼東西? : 想法要怎樣修改才可以求得正解? 小弟目前做到現在,已經可以把小資測正確處理 不過遇到1000 2000的資測時,輸出答案會比正確答案大45 遇到10000 20000時,會比正確答案大90... 現在的接續先前的想法 起初,先將p,q各自處理成10的倍數 若為11 121,就會先變成10 120,中間則依照公式處理掉存入變數 剩下的就是照原先想法作 但現在就卡在這些資測無法正確處理,請問我的程式到目前有什麼錯誤或遺漏之處? 以下為程式碼: #include<stdio.h> int main() { long int p,q,i; double title,tmp1,tmp2; while(scanf("%ld %ld",&p,&q)!=EOF) { if(p<0&&q<0) break; title=0; tmp1=0; tmp2=0; p=p-1; if(p%10!=0) /*處理個位數的部份*/ for(tmp1=0;p%10!=0;p--) tmp1+=p%10; if(q%10!=0) for(tmp2=0;q%10!=0;q--) tmp2+=q%10; if(p>=10) /*處理乘上45的部份*/ for(p/=10;;p/=10) { tmp1+=p*45; if(p/10==0) break; } if(q>=10) for(q/=10;;q/=10) { tmp2+=q*45; if(q/10==0) break; } for(i=1;i<=p;i++) /*處理最大一位的值*/ tmp1+=i; for(i=1;i<=q;i++) tmp2+=i; title=tmp2-tmp1; printf("%.0lf\n",title); } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.235.205
文章代碼(AID): #19i-guuH (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #19i-guuH (C_and_CPP)