| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1074 人关注过本帖, 1 人收藏
标题:求C计算大数的方法。
只看楼主 加入收藏
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
结帖率:87.5%
收藏(1)
已结贴  问题点数:20 回复次数:7 
求C计算大数的方法。
  公倍数

为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。

我们希望寻找到能除尽1至n的的每个数字的最小整数。

不要小看这个数字,它可能十分大,比如n=100, 则该数为:
69720375229712477164533808935312303556800

请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。

例如:
用户输入:
 `
用户输入:
10
程序输出:
2520
这道题  我也写了代码,但是逻辑复杂。
求大数运算的简单思路,不求代码。
搜索更多相关主题的帖子: 最小公倍数 编写程序 用户 
2013-04-10 15:01
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
*/
#include<stdio.h>
#define N 100
void main()
{
    void yueer(int *a,int *n,int *b);
    int a[N],b[N],i,j,n,n1,sum=1;
    printf("please input your data!\n");
    scanf("%d",&n);
    for(i=0;i+n/2<=n;i++)
    {
        a[i]=n/2+i+1;
    }
    if(n%2==0)
        n=n/2;
    else
        n=n/2+1;
    yueer(a,&n,b);
    for(i=0;i<=n;i++)
    {
        printf("%d",a[i]);
    }


}
void yueer(int *a,int *n,int *b)
{
    int i,j=0,count=0,t;
    for(i=0;i<*n;i++)
    {
        if(a[i]%2==0)
            a[i]/=2;
    }
    b[count++]=2;
    for(i=0;i<*n;i++)
        for(j=i+1;j<*n;j++)
        {
            if(a[j]%a[i]==0)
            {
                for(t=i;t+1<*n;t++)               
                {
                    a[t]=a[t+1];
                }

            }
        }
        (*n)--;
}
好吧,为了避免误认为求作业贴,发上自己的代码。  真的丢人啊。。      

有问题一起探讨,一起进步。
2013-04-10 15:18
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:10 
哪里的题目  给个网址?

                                         
===========深入<----------------->浅出============
2013-04-10 15:58
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
回复 3楼 laoyang103
哦,这个是老师给我的。是acm的题。

有问题一起探讨,一起进步。
2013-04-10 19:06
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:10 
回复 楼主 y3765258
大数运算的思路是 用数组模拟大数 每个int元素表示大数中的4个十进制位 做乘法的时候按照规则循环处理就行
最小公倍数的思路是 每乘进一个数 就从后续含有该值的数中除去该值
这样的逻辑算简单么?
程序代码:
#include <stdio.h>

void multi(int *p, int k, int *n);

int dat[101], res[100];

int main()
{
    int i, j, n, cnt;
    
    printf("Input N: ");
    scanf("%d", &n);
    
    for (i = 1; i <= n; i++) dat[i] = i;
    
    for (res[0] = cnt = i = 1; i <= n; i++) {
        if (dat[i] == 1) continue;
        
        multi(res, dat[i], &cnt);
        for (j = 2; j * i <= n; j++) dat[j*i] /= dat[i];
    }
    
    printf("%d", res[cnt-1]);
    for (i = cnt-2; i >= 0; i--) 
        printf("%04d", res[i]);
    
    return 0;
}

void multi(int *p, int k, int *n)
{
    int i, c, tmp;
    
    for (c = i = 0; i < *n; i++) {
        tmp = p[i] * k;
        p[i] = c + tmp % 10000;
        c = tmp / 10000;
    }
    
    if (c > 0) p[(*n)++] = c;
}
收到的鲜花
  • y37652582013-04-11 10:25 送鲜花  5朵   附言:原创内容,很好的代码。

人生是一场错过 愿你别蹉跎
2013-04-10 22:34
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
回复 5楼 fanpengpeng
谢谢你的解答。思路很明确,而且可行性很高,代码也很简洁。不多说了,分肯定给你了。
ps;如果能在语句上加上注解就好了。

有问题一起探讨,一起进步。
2013-04-11 10:24
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
我是看了 “Linux内核代码风格” 那个文档里的关于代码注释的建议 才改变了对代码加一大堆注释的习惯的
我以前写代码也喜欢写一堆无用的注释
他那里面说
    注释是好的,但也存在过度注释的危险。永远不要尝试在注释里面解释代码是如何工作
:代码看起来一目了然是最理想的,况且给糟糕的代码添加注释无疑是在浪费时间。
    一般来说,你希望你的注释能够表述代码实现的功能是什么,而不是怎么实现的。同时,
还要注意避免把注释放到函数体里面:如果函数复杂到需要分段注释才可以的话,你或许应
该回顾一下第6 节。对于代码中一些比较巧妙的(或者糟糕的)做法,可以添加适当的注释,
但不宜太多。推荐的做法是把注释放在函数前面,解释一下这个函数是什么功能,为什么这
么做。

有一句比较狠的话是 你应该思考怎样去把代码写的更好 而不是浪费时间试图去解释你的那些糟糕的代码
所以就养成习惯 不为语句加注释 只为函数描述功能
由于这里没什么含义深刻的函数 所以就没有加注释
而且始终认为 注释对代码来说 是越解释越糟糕 好的代码 应该代码本身就是注释

人生是一场错过 愿你别蹉跎
2013-04-11 11:44
wlguyu1985
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-3-22
收藏
得分:0 
以下是引用fanpengpeng在2013-4-10 22:34:11的发言:

大数运算的思路是 用数组模拟大数 每个int元素表示大数中的4个十进制位 做乘法的时候按照规则循环处理就行
最小公倍数的思路是 每乘进一个数 就从后续含有该值的数中除去该值
这样的逻辑算简单么?
#include <stdio.h>

void multi(int *p, int k, int *n);

int dat[101], res[100];

int main()
{
    int i, j, n, cnt;
   
    printf("Input N: ");
    scanf("%d", &n);
   
    for (i = 1; i <= n; i++) dat = i;
   
    for (res[0] = cnt = i = 1; i <= n; i++) {
        if (dat == 1) continue;
        
        multi(res, dat, &cnt);
        for (j = 2; j * i <= n; j++) dat[j*i] /= dat;
    }
   
    printf("%d", res[cnt-1]);
    for (i = cnt-2; i >= 0; i--)
        printf("%04d", res);
   
    return 0;
}

void multi(int *p, int k, int *n)
{
    int i, c, tmp;
   
    for (c = i = 0; i < *n; i++) {
        tmp = p * k;
        p = c + tmp % 10000;
        c = tmp / 10000;
    }
   
    if (c > 0) p[(*n)++] = c;
}

思路好清晰,好思路!赞一个。
2013-04-11 11:45
快速回复:求C计算大数的方法。
数据加载中...
 
   



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

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