| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5204 人关注过本帖
标题:菜鸟解决不了的加法来人帮忙啊!
只看楼主 加入收藏
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
测试结果(假如你不对那上面的代码存在异议的话):
1000000次循环的时候
你的代码在偶机子上时间1922ms
偶的代码为1422ms


[color=white]<" border="0" />>
2008-08-06 11:43
hello_moto
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-7-15
收藏
得分:0 
晕,我是想看看效率更高的代码,不是看看效率更高的结果。。。。
2008-08-06 11:56
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
第二个测试结果(在不计算字符串初始化部分的话,好像你不太喜欢这个测试吧):
循环1000000次
你的代码在偶机子上844ms
偶的代码则为77ms

PS:你的代码改为:
    while(Input())
    {
        _strrev(a),_strrev(b);
        for(int lpn=0; lpn<1000000; ++lpn)
            fun(a, b, res);
        //printf("%s\n",_strrev(res));
    }
并且Input函数里的n改为1


偶还想测试一下串长为100000的看看。。。

[color=white]<" border="0" />>
2008-08-06 12:00
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
/*******************************************************************
** HighlightCodeV3.2 software by yzfy(雨中飞燕) http:// **
*******************************************************************/
#include "stdio.h"
#include "string.h"
#define MAX_STR_LEN 205
#define MAX_INT 1000000000
char a[MAX_STR_LEN + 9], b[MAX_STR_LEN + 9];
int na[MAX_STR_LEN/3+3], nb[MAX_STR_LEN/3+3], nc[MAX_STR_LEN/3+3];
int nmap[16][16][16], *pmap=(int*)nmap;
void Init()
{
   
for (int a=0; a<=9; ++a)for (int b=0; b<=9; ++b)
            for (int c=0; c<=9; ++c)nmap[a][b][c] = a*100+b*10+c;
}
#define GetVal(a,b,c) pmap[((a<<4)+b<<4)+c]
void Str2BInt(int* na, char* a)
{
   
char* pa=a+8;
    int al = strlen(pa), n;
    for (n=0; n<al; n+=4) *((int*)(pa+n)) -= '0000';
    *((int*)(pa+n)) -= '0000';
    for (n=1, pa+=al-9; pa>=a; pa-=9,++n)
    {
        
na[n] = GetVal(*pa, pa[1], pa[2])*1000000
               
+ GetVal(pa[3], pa[4], pa[5])*1000 + GetVal(pa[6], pa[7], pa[8]);
    }
   
na[n] = 0;
    na[0] = n-1;
}
int* Calc()
{
   
Str2BInt(na, a);
    Str2BInt(nb, b);
    int *pa=na, *pb=na;
    int ns = na[0]>nb[0]?(pb=nb,nb[0]):(pa=nb,na[0]);
    int n=1;
    for ( ; n<=ns; ++n)
    {
        
pa[n] += pb[n];
        if (pa[n]>=MAX_INT)
        {
            
pa[n] -= MAX_INT;
            ++pa[n+1];
        }
    }
   
for ( ; pa[n]>=MAX_INT; ++n)
    {
        
pa[n] -= MAX_INT;
        ++pa[n+1];
    }
   
if (pa[n]==0) --n;
    if (n>pa[0]) pa[0]=n;
    return pa;
}
int Input()
{
   
return gets(a+8) && gets(b+8);
}
void Output(int* p)
{
   
int n = p[0];
    printf("%d", p[n]);
    for (--n; n>0; --n) printf("%09d", p[n]);
    putchar('\n');
}
int main()
{
   
Init();
    while (Input())
    {
        
int*p;
        p = Calc();
        Output(p);
    }
   
return 0;
}


这是偶的代码,写得恶心了一点,还没测试完。。。。


[color=white]<" border="0" />>

[[it] 本帖最后由 爱喝牛奶的猫咪 于 2008-8-6 12:27 编辑 [/it]]
2008-08-06 12:03
hello_moto
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-7-15
收藏
得分:0 
好了,可以到此为止了。
坦率的说,没有仔细看你的代码,因为为了效率,你的可读性已经很差了。我承认你的效率更高吧。
2008-08-06 12:11
hello_moto
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-7-15
收藏
得分:0 
/*******************************************************************
** HighlightCodeV3.2 software by yzfy(雨中飞燕) http:// **
*******************************************************************/
#include "stdio.h"
#include "string.h"
#define MAX_STR_LEN 205
#define MAX_INT 1000000000
char a[MAX_STR_LEN + 9], b[MAX_STR_LEN + 9];
int na[MAX_STR_LEN/3+3], nb[MAX_STR_LEN/3+3], nc[MAX_STR_LEN/3+3];
int nmap[16][16][16], *pmap=(int*)nmap;
void Init()
{
    for (int a=0; a<=9; ++a)for (int b=0; b<=9; ++b)
            for (int c=0; c<=9; ++c)nmap[a][b][c] = a*100+b*10+c;
}
#define GetVal(a,b,c) pmap[((a<<4)+b<<4)+c]
void Str2BInt(int* na, char* a)
{
    char* pa=a+8;
    int al = strlen(pa), n;
    for (n=0; n<al; n+=4) *((int*)(pa+n)) -= '0000';
    *((int*)(pa+n)) -= '0000';
    for (n=1, pa+=al-9; pa>=a; pa-=9,++n)
    {
        na[n] = GetVal(*pa, pa[1], pa[2])*1000000
                + GetVal(pa[3], pa[4], pa[5])*1000 + GetVal(pa[6], pa[7], pa[8]);
    }
    na[n] = 0;
    na[0] = n-1;
}
int* Calc()
{
    Str2BInt(na, a);
    Str2BInt(nb, b);
    int *pa=na, *pb=na;
    int ns = na[0]>nb[0]?(pb=nb,nb[0]):(pa=nb,na[0]);
    int n=1;
    for ( ; n<=ns; ++n)
    {
        pa[n] += pb[n];
        if (pa[n]>=MAX_INT)
        {
            pa[n] -= MAX_INT;
            ++pa[n+1];
        }
    }
    for ( ; pa[n]>=MAX_INT; ++n)
    {
        pa[n] -= MAX_INT;
        ++pa[n+1];
    }
    if (pa[n]==0) --n;
    if (n>pa[0]) pa[0]=n;
    return pa;
}
int Input()
{
    return gets(a+8) && gets(b+8);
}
void Output(int* p)
{
    int n = p[0];
    printf("%d", p[n]);
    for (--n; n>0; --n) printf("%09d", p[n]);
    putchar('\n');
}
int main()
{
    Init();
    while (Input())
    {
        int*p;
        p = Calc();
        Output(nc);
    }
    return 0;
}

你这个程序能正确运行???????????????????
你确定Output(nc);这一句没有写错?
2008-08-06 12:24
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
要说可读性,你的好不到哪里去。
你既然要比效率,那我基本不先考虑可读性
当然,如果你说你不比效率了,要比可读性,那我会考虑一下重写,假如我有时间


[color=white]<" border="0" />>
2008-08-06 12:26
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
Output(nc); 改 Output(p);
前面已经改好


[color=white]<" border="0" />>
2008-08-06 12:27
hello_moto
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-7-15
收藏
得分:0 
还是先比较正确性吧。。。。。。

排错了楼,应该排在46#之后。

[[it] 本帖最后由 hello_moto 于 2008-8-6 12:34 编辑 [/it]]
2008-08-06 12:28
爱喝牛奶的猫咪
Rank: 1
来 自:QQ群46520219
等 级:禁止访问
帖 子:513
专家分:0
注 册:2008-6-16
收藏
得分:0 
哪里有错现在?


[color=white]<" border="0" />>
2008-08-06 12:32
快速回复:菜鸟解决不了的加法来人帮忙啊!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034126 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved