一条很简单的C语言题,但是我超时了,求大神解答?只有神知道的世界
在天地人三界之中,二次元空间已是家喻户晓。但是,存在于神秘国度的三次元空间却鲜为人知,因为那是只有神知道的世界。传说中,要进入三次元空间必须通过守门大将的考核。这是一个很...
在天地人三界之中,二次元空间已是家喻户晓。但是,存在于神秘国度的三次元空间却鲜为人知,因为那是只有神知道的世界。
传说中,要进入三次元空间必须通过守门大将的考核。
这是一个很简单的题目。
对于任意一个非负数N,我们定义D(N) 为N上奇数数字的和加上两倍偶数数字的和。举个例子:D(567) = 5 + 6 * 2 + 7 = 24, D(314159) = 3 + 1 + 2 * 4 + 1 + 5 + 9 = 27.
令F(N)表示D(N)的最后一位数字。例如:F(567) = 4, F(314159) = 7。
你的问题是,给你两个数A, B,你要计算出∑F(i), i ∈ [A, B]
对于聪明的你这太简单了,赶紧解决去观摩只有神知道的世界吧~
(出题人Troy)
输入格式
第一行输入一个整数T,表述有T组case。(T <=1000)
接下来T行,每行输入两个数字A, B (0 <= A <= B <= 400,000,000)
输出格式
每一行输出一个整数,表示题目所要求的和。
输入样例
3
1 8
28 138
314159 314159
输出样例
36
495
7
#include <stdio.h>
int add(long C)
{
int result=0,n;
while(C>0)
{
n=C%10;
if(n%2!=0)
result+=n;
else
result+=n*2;
C/=10;
}
return result;
}
int main()
{
int t,i,j;
static int sum[1000];
long A,B,C;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%ld%ld",&A,&B);
for(C=A;C<=B;C++)
{
sum[i]+=add(C)%10;
}
}
for(i=0;i<t;i++)
printf("%d\n",sum[i]);
return 0;
} 展开
传说中,要进入三次元空间必须通过守门大将的考核。
这是一个很简单的题目。
对于任意一个非负数N,我们定义D(N) 为N上奇数数字的和加上两倍偶数数字的和。举个例子:D(567) = 5 + 6 * 2 + 7 = 24, D(314159) = 3 + 1 + 2 * 4 + 1 + 5 + 9 = 27.
令F(N)表示D(N)的最后一位数字。例如:F(567) = 4, F(314159) = 7。
你的问题是,给你两个数A, B,你要计算出∑F(i), i ∈ [A, B]
对于聪明的你这太简单了,赶紧解决去观摩只有神知道的世界吧~
(出题人Troy)
输入格式
第一行输入一个整数T,表述有T组case。(T <=1000)
接下来T行,每行输入两个数字A, B (0 <= A <= B <= 400,000,000)
输出格式
每一行输出一个整数,表示题目所要求的和。
输入样例
3
1 8
28 138
314159 314159
输出样例
36
495
7
#include <stdio.h>
int add(long C)
{
int result=0,n;
while(C>0)
{
n=C%10;
if(n%2!=0)
result+=n;
else
result+=n*2;
C/=10;
}
return result;
}
int main()
{
int t,i,j;
static int sum[1000];
long A,B,C;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%ld%ld",&A,&B);
for(C=A;C<=B;C++)
{
sum[i]+=add(C)%10;
}
}
for(i=0;i<t;i++)
printf("%d\n",sum[i]);
return 0;
} 展开
展开全部
直接硬算肯定TLE。话说那个add(C)后面%10干嘛。
这类题类似于:从数字A到数字B,连在一起写(比如15到25,就是1516171819202122232425),0~9各数字各出现了几次。这是可以直接计算而不必遍历的。
05年ICPC上海交大赛区就有这个变种。
思路是这样的:计算个十百千万等各位数字上0到9分别出现了几次。出现的次数是更高位的次数 * 低位的遍历。
比如0~12345,那么千位数上出线0的次数是1000次(从10000~10999),出现1的次数是2000次(1000~1999和11000~11999),出现2的次数是1346次(2000~2999,12000~12345),出现3~9都是1000次(X000~X999)。
这类题类似于:从数字A到数字B,连在一起写(比如15到25,就是1516171819202122232425),0~9各数字各出现了几次。这是可以直接计算而不必遍历的。
05年ICPC上海交大赛区就有这个变种。
思路是这样的:计算个十百千万等各位数字上0到9分别出现了几次。出现的次数是更高位的次数 * 低位的遍历。
比如0~12345,那么千位数上出线0的次数是1000次(从10000~10999),出现1的次数是2000次(1000~1999和11000~11999),出现2的次数是1346次(2000~2999,12000~12345),出现3~9都是1000次(X000~X999)。
更多追问追答
追问
我大概明白你的意思了,但是他需要求每个数字的奇数和2倍偶数的和的末尾喔,如果像你这样不遍历,有可能实现的了求末尾么?按你这种说法,具体操作是怎样呢?
追答
哦,没注意到“末尾”。
不过我的算法没问题。
比如a0个0,a1个1,a2个2……a9个9
答案就是 1 * a1 + 3 * a3 + 5 * a5 + 7 * a7 + 9 * a9 + 2 * (2 * a2 + 4 * a4 + 6 * a6 + 8 * a8)。
模10运算,求和后求余数,和拆开后求余数再求和,结果是一样的。
这题基本上就是两个嵌套的for循环,外层循环从个位、十位……到最高位;内层循环从0~9。接下来就是计算特定位置上特定数出现的次数了。
PS:为了简便计算,先求出0~(A - 1)中各个数字出现的次数,再计算0~B中各个数字出现的次数,然后减一下就行。这样比直接计算A~B各数字出现次数容易一些。
PS2:这道题相对上海那题,容易之处在于,0出现几次是无所谓的(因为0最后求和时还是0)。所以对于0~12345,可以视为00000~12345。这样可以很轻松的解决问题了吧。
给个具体的例子:对于0~123456,计算千位上的各数出现的次数。0~9分成3档:小,中,大。
【小】计算0~2出现的次数:看千位上数字是3(123456的千位),0~2比3小,所以0~2出现的次数是比千位更高的数字的遍历(这里就是00~12,一共13次) * 比千位低的遍历(000~999共1000次),所以是13000次。
【中】计算3出现的次数:千位刚好是3,所以出现的次数是比千位更高的数字的遍历(00~11,注意不是12而是11) * 1000,然后千位以上是12时,123000~123456,千位上的3出现的次数再多了456 + 1 = 457个。所以结果是12000 + 457 = 12457。
【大】计算4~9出现的次数,由于4~9都比3大,所以出现的次数是比千位更高的数字的遍历(00~11,这里还是11而不是12) * 1000,所以出现了12000次。
TableDI
2024-07-18 广告
2024-07-18 广告
VLOOKUP是Excel中用于垂直查找的函数,其基本用法包括四个参数:1. 查找值:即在数据表首列中需要搜索的值。2. 数据表:包含查找值的单元格区域或数组。3. 返回值所在列数:指定返回查询区域中第几列的值。4. 查找方式:选择精确匹配...
点击进入详情页
本回答由TableDI提供
展开全部
把add如下改一下试试
int add(long C){
int result=0,n;
while(C>0){
result+=(n=C%10) << (~n&1);
C/=10;
}
return result;
}
int add(long C){
int result=0,n;
while(C>0){
result+=(n=C%10) << (~n&1);
C/=10;
}
return result;
}
更多追问追答
追问
还是超时了,不过你能讲解一下你这么改是什么意思么?看不太懂?
追答
我再给你改一个,并说明改的意思。
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
int add(long a,long b){
int result,od,ev,t,i,x;
for(result=od=ev=0,i=a;(x=i)B)
printf("Error!Reso...\n");
sum[i]=add(A,B);
}
for(i=0;i<t;i++)
printf("%d\n",sum[i]);
}
思路就是不要三番五次调用函数,调用一次把所有事做完,减少调用时耗。其余的看注释。结果行不行我也不知道……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |