Re: [問題] 有關ACM10994
※ 引述《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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章