广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 5005 个阅读者
 
<<   1   2  下页 >>(共 2 页)
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
Chiunyao 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
社区建设奖 特殊贡献奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x4 鲜花 x776
分享: 转寄此文章 Facebook Plurk Twitter 版主评分版主评分 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[C/C++][范例] Big Number(大数相加)
顺便帮这位楼主解答一下呗.....





这个程式是大数相加....意思就是说在普通的电脑可能只能做到32767这么大的数字相加或相减

如果你想要在更多的位数相加要怎么办(就是当变数宣告成int long double...etc..都无法解决时)

可以利用STRING(指标)来处理这种问题...因为你的指标可以宣告很大所以你把每一位..宣告成一个

指标,然后用指标相加在配合一些进位的规则..就可以做出大数相加的计算式拉!!!


延伸:我如果没记错的话...好像指标的MAX范围好像道255唷..如果你的位数又要超过255这时候要怎么半

呢,我提供一下我上课听到的东西,就是当你超过255那么大的位数,好比几万位 ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



[ 此文章被Chiunyao在2005-04-09 11:33重新编辑 ]

此文章被评分,最近评分记录
财富:100 (by panasonic732)
支持度:10 (by panasonic732) | 理由: 有你的..!!那么利害&热心 特别给你的奖励
财富:100 (by 夷希微) | 理由: 嗯嗯~果然厉害~<img src=http://bbs1.mychat.to/images/post/smile/35.gif>



     


人要活在当下....才是最幸福的!!!
献花 x5 回到顶端 [楼 主] From:台湾中华电信 | Posted:2005-04-02 11:39 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

延伸:我如果没记错的话...好像指标的MAX范围好像道255唷..如果你的位数又要超过255这时候要怎么半

呢,我提供一下我上课听到的东西,就是当你超过255那么大的位数,好比几万位几万位相加减或,相乘

那是不是电脑根本没办法运算...所以你可以运用255进位的方法来写..就是把它当作是一个BYTE...

这样就可以表达很大很大的数目....其实这个方法我也不会写,只是知道大概的观念。会的人可以指正

一下唷....


听大大的解释....
我想我大概知道怎么写了.....
下次有时间的话....
我试着写写看....
写完再放上来啰^^.....


没东西可以抓
献花 x0 回到顶端 [1 楼] From:美国 | Posted:2005-04-04 09:59 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

我来啰....
你只是要做100*100的相乘对吧....
你先想想看第一个问题.....
100位数*100位数的结果最大会有几位数呢.....
m=100;
n=100;

答案就是m+n位数.....

再想想另一个问题....我们是如何做乘法的.....
举个例.....
  15
*30
----------
  00
45
--------
450

是用第二个数乘上第一个数.....
那么0先乘上5会落在第几个阵列位置呢(假设个位数的阵列位置为a[0])......
答案就是第0个位置.....若是有进位的话.....就是i+1个位置.....
同样的....3乘上1会落在第几个位置....答案是第2个.....
也就是说.....当你用两个FOR回圈去计算结果的话(假设A为第一个数....B为第二个数.....C为结果)...
那么C[i+j]=A[ i ]*B[j]+CarryIn.....
这样讲你听的懂了ㄇ????
真的有问题我在帮你写写看^^......


[ 此文章被唐老鸭在2005-04-08 10:44重新编辑 ]

此文章被评分,最近评分记录
财富:100 (by Chiunyao) | 理由: 谢谢你的热心指导....


没东西可以抓
献花 x1 回到顶端 [2 楼] From:美国 | Posted:2005-04-08 10:26 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

再改一下....
有一点点说错....
应该是C[i+j]+=(A[ i ]*B[j]+CarryIn);
因为要包含重复项..... 表情


没东西可以抓
献花 x0 回到顶端 [3 楼] From:美国 | Posted:2005-04-08 19:44 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

给你程式码....
因为加CarryIn的写法我觉得比较麻烦....
要加比较多的式子....
所以我干脆把CarryIn都省略了....
不过我写的比较简略....
但一样是照上面跟你说的方法写的.....
你可能要拿张纸写些变数来验证我的演算法....
这样你就应该知道我为什么这么写了.....

印列的部分就交给你改啦....
因为假如2位数*2位数答案只有3位数的话....
第4个位数的0还是会印出来啦.....
所以哪边你自己在改一下就好....
我只是要验证我的答案对不对....
所以就不改了....

复制程式
#include <stdio.h>
#include <iostream.h>

#define m 2
#define n 2

void main()
{
       int a[m]={5,1};
       int b[n]={0,3};
       int c[m+n];
       int temp;
       int i,j,k;
       for(k=0;k<m+n;k++)
                    c[k]=0;
       
       //主要演算法的部分
       for(j=0;j<n;j++)
       {
          for(i=0;i<m;i++)
         {
             temp= a[ i ]*b[j]+c[i+j];
             c[i+j]=temp%10;
             c[i+j+1]+=(temp/10);
                        }
               }
    
//列印答案
    for(k=m+n-1;k>=0;k--)
     printf("%d",c[k]);
}


记的自己把位数改大一点做测试....
我有写错再告诉我 表情 .....

此文章被评分,最近评分记录
财富:100 (by Chiunyao) | 理由: 谢谢你的热心指导....


没东西可以抓
献花 x2 回到顶端 [4 楼] From:美国 | Posted:2005-04-09 11:05 |
Chiunyao 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
社区建设奖 特殊贡献奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x4 鲜花 x776
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

复制程式
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(void)
{
       srand(time(0));
       char a[3];
       char b[3];
       char c[6];
          char carry[6];
       int i,j,k,l;
          int temp=0;
       srand((unsigned)(time(NULL)));
       for(i=0;i<3;i++)
       {
              a[i]=rand()%10+0x30;
              b[i]=rand()%10+0x30;
       }
       while(a[2]==Ɔ')
       {
              a[2]=rand()%10+0x30;
       }
       while(b[2]==Ɔ')
              b[2]=rand()%10+0x30;
       for(j=0;i<3;i++)
          {
                 for(k=0;k<=j;k++)
                 {
                        temp+=(b[k]-0x30)*(a[j-k]-0x30);
                 }
                 carry[j]=((temp-0x30)/10)+0x30;
                 c[j]=((temp+(carry[j]-0x30))%(10*((temp+(carry[j]-0x30))/10)))+0x30;
          }
          for(l=2;l>=0;l--)
                 printf("%c",a[i]);
          printf("\n");
              for(l=2;l>=0;l--)
                     printf("%c",b[i]);
              printf("\n");
              for(l=5;l>=0;l--)
                     printf("%c",c[i]);
}




     


人要活在当下....才是最幸福的!!!
献花 x0 回到顶端 [5 楼] From:台湾中华电信 | Posted:2005-04-09 12:15 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

[quote]下面是引用Chiunyao于2005-04-9 12:15发表的 :

for(j=0;i<3;i++)
      {
          for(k=0;k<=j;k++)
          {
                temp+=(b[k]-0x30)*(a[j-k]-0x30);
            }
      carry[j]=((temp-0x30)/10)+0x30;
          c[j]=((temp+(carry[j]-0x30))%(10*((temp+(carry[j]-0x30))/10)))+0x30;
      }

我并没有很仔细看你怎么做的....
不过大概可以知道你错在哪里...
看下面的才对.... 表情


[ 此文章被唐老鸭在2005-04-09 12:58重新编辑 ]


没东西可以抓
献花 x0 回到顶端 [6 楼] From:美国 | Posted:2005-04-09 12:34 |
Chiunyao 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
社区建设奖 特殊贡献奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x4 鲜花 x776
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

挖挖我懂了.....原来是这样,我一直想我的演算法应该是没有错误
怎么跑不出来...

原来是转换的问题....我在想想怎么改...谢谢你啦


     


人要活在当下....才是最幸福的!!!
献花 x1 回到顶端 [7 楼] From:台湾中华电信 | Posted:2005-04-09 12:39 |
唐老鸭
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x1 鲜花 x230
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用Chiunyao于2005-04-9 12:39发表的 :
挖挖我懂了.....原来是这样,我一直想我的演算法应该是没有错误
怎么跑不出来...

原来是转换的问题....我在想想怎么改...谢谢你啦

你的写法有一个重大的问题....
我刚才讲得可能有一点错.....
没注意看....
抱歉.....
你看这一段....
carry[j]=((temp-0x30)/10)+0x30;
如果你temp没大于48的话....你相减就已经变成负数了.....
你算carry[j]那边的逻辑绝对是有问题的.....


[ 此文章被唐老鸭在2005-04-09 13:02重新编辑 ]


没东西可以抓
献花 x0 回到顶端 [8 楼] From:美国 | Posted:2005-04-09 12:54 |
Chiunyao 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
社区建设奖 特殊贡献奖
小有名气
级别: 小有名气 该用户目前不上站
推文 x4 鲜花 x776
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

痾痾...鸭老大帮我看一下拉,我修改你的...还是出现乱码呢..是哪里错呢
复制程式
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
       srand(time(0));
       char a[3];
       char b[3];
       char c[6];
       int i,j,k,carry;
       int temp;
       srand((unsigned)(time(NULL)));

       for(i=0;i<3;i++)
       {
              a[i]=rand()%10+0x30;
              b[i]=rand()%10+0x30;
       }
       while(a[2]==Ɔ')
       {
              a[2]=rand()%10+0x30;
       }
       while(b[2]==Ɔ')
       {
              b[2]=rand()%10+0x30;
       }
        
       //主要演算法的部分
       for(j=0;j<3;j++)
       {
          for(i=0;i<3;i++)
         {
             temp=((a[i]-0x30)*(b[j]-0x30))+(c[i+j]-0x30);
             c[i+j]=(temp%10)+0x30;
             c[i+j+1]+=((temp/10)+0x30);
                }
          }
    
//列印答案
              for(i=2;i>=0;i--)
                 printf("%c",a[i]);
              printf("\n");
              for(i=2;i>=0;i--)
                 printf("%c",b[i]);
              printf("\n");
              for(i=5;i>=0;i--)
                 printf("%c",c[i]);
              printf("\n");
}



     


人要活在当下....才是最幸福的!!!
献花 x0 回到顶端 [9 楼] From:台湾中华电信 | Posted:2005-04-11 22:49 |

<<   1   2  下页 >>(共 2 页)
首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.060977 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言