作者h3615840 (傲笑苍鹰)
看板C_and_CPP
标题Re: [问题] 有关ACM10994
时间Sun Mar 8 23:56:39 2009
※ 引述《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