| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 580 人关注过本帖
标题:闲来无事,散散分 也期望闲来无事的大侠们进来水水
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:10 
闲来无事,散散分 也期望闲来无事的大侠们进来水水
程序代码:
#include <stdio.h>
#include <malloc.h>

//把一个正整数分解为2^n+
void mi(int s,int* t,int* len)
{
    int i=0;
    for(;s>0;i++)
    {
        *(t+i)=s & 1;
        s>>=1;
    }
    *len=i;
}
//使用移位计算等差数列之和
int w_add(int begin,int* t,int end)
{
    int k=begin+end;
    int j=end-begin+1;
    int m=k;
    int sum=0;
    int len=0;
    mi(j,t,&len);
    for(int i=0,k=m;i<len;i++) if(*(t+i)) sum+=k<<i;
    return sum>>=1;
}
//测试部分
int main()
{
    int a=1234;
    int b=9876;
     int* t;
    t=(int*)malloc(sizeof(int)*32);
    int s=w_add(a,t,b);
    printf("%d+......+%d=%d\n",a,b,s);
    free(t);
    return 0;
}


[此贴子已经被作者于2015-10-30 13:50编辑过]

2015-10-30 13:43
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:34 
看能不能蹭点分

总有那身价贱的人给作业贴回复完整的代码
2015-10-30 13:52
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 2楼 embed_xuel
要多少分 哥有   嘿嘿

DO IT YOURSELF !
2015-10-30 13:54
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:34 
闲来无事。。。

一片落叶掉进了回忆的流年。
2015-10-30 14:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:34 
你的算法就是将 a*b 转化为 a*(c+d+e+……)
例如 a*1011 转化为 a*1000 + a*10 + a*1

你的代码,我觉得有两个小小的瑕疵
第一点,w_add 函数中定义的变量太多了,看得人眼花
第二点,为了获得bit上的信息而开辟一个动态内存 有点儿得不偿失
程序代码:
#include <stdio.h>

int main( void )
{
    const int a = 1234;
    const int b = 9876;

    int sum = 0;
    {
        for( size_t i=0; i!=sizeof(sum)*8; ++i )
            if( (b-a+1) & (1u<<i) )
                sum += (a+b)<<i;
        sum /= 2;
    }
    printf( "%d+......+%d = %d\n", a, b, sum );

    return 0;
}

2015-10-30 15:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
再说两点吧,malloc函数按标准其实在 <stdlib.h> 中,估计你受VC误导了,因为msdn说<malloc.h>也可以
int的bits数目直接写死为32不好,例如 ILP64模型数据 中,int就是64bits
2015-10-30 15:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 6楼 rjsp
谢谢了

我目前接触到的电脑就是32位为最高  64位的尚未接触过的

DO IT YOURSELF !
2015-10-30 15:27
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 5楼 rjsp
我再研究研究  你的代码属于位运算的复杂应用了  一时半会还弄不透彻

DO IT YOURSELF !
2015-10-30 15:29
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
原来1<<i 会获得2^i 这么神奇

DO IT YOURSELF !
2015-10-30 15:43
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
程序代码:
#include <stdio.h>

int main( void )
{
    const int a = 1234;
    const int b = 9876;

    int sum = 0;
    {
        int i;
        for( i=0; i!=sizeof(sum)*8; ++i )
            if( (b-a+1) & (1<<i) )
                sum += (a+b)<<i;
        sum /= 2;
    }
    printf( "%d+......+%d = %d\n", a, b, sum );

    return 0;
}




"a.c" 28L, 334C


unix下编译通过运行

DO IT YOURSELF !
2015-10-31 08:11
快速回复:闲来无事,散散分 也期望闲来无事的大侠们进来水水
数据加载中...
 
   



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

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