鱼C论坛

 找回密码
 立即注册
查看: 4878|回复: 30

怎么做两个20位数和25位数的相加减。用数组做?

[复制链接]
发表于 2013-6-1 00:40:07 | 显示全部楼层 |阅读模式
1鱼币
如题,大家帮帮我把,

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 00:40:08 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.         unsigned char uc_Twenty[21] = {0};         //长度为20位的整数
  7.         unsigned char uc_TwentyFive[26] = {0};     //长度为25位的整数

  8.         unsigned char uc_sum[27] = {0};            //和

  9.         memset(uc_Twenty,0,20);
  10.         memset(uc_TwentyFive,0,25);
  11.         memset(uc_sum,0,27);

  12.         printf("请输入20位长度的正整数:");
  13.         //fgets(uc_Twenty,20,stdin);
  14.        
  15.         scanf("%s",uc_Twenty);

  16.         fflush(stdin);
  17.         printf("请输入25位长度的正整数:");
  18.         //fgets(uc_TwentyFive,25,stdin);
  19.         scanf("%s",uc_TwentyFive);

  20.         fflush(stdin);


  21.         unsigned char cCarry = 0;      //进位值
  22.         unsigned char cTemp = 0;
  23.         //计算两整数相加
  24.         int i = 19;
  25.         int j = i + 5;
  26.         int k = j + 1;
  27.         for (i = 19; i >= 0; i--)
  28.         {
  29.                 j = i + 5; //25  位数组下标
  30.                 k = j + 1; //和数组的下标
  31.                 if (uc_Twenty[i] > '9' || uc_Twenty[i] < '0' || uc_TwentyFive[j] > '9' || uc_TwentyFive[j] < '0')
  32.                 {
  33.                         printf("输入整数不正确,包含非数字字符\n");
  34.                         return 0;
  35.                 }

  36.                 //各个位上求和
  37.                 cTemp = cCarry  + uc_Twenty[i] - '0' + uc_TwentyFive[j] - '0';
  38.                 if (cTemp > 9)
  39.                 {
  40.                         //如果和大于9,则表示有进位
  41.                         cCarry = 1;
  42.                         cTemp = cTemp - 10;
  43.                 }
  44.                 else
  45.                 {
  46.                         //如果和小于9,则表示没有进位
  47.                         cCarry = 0;
  48.                 }

  49.                 uc_sum[k] = cTemp + '0';
  50.                 cTemp = 0;
  51.         }

  52.         //处理高5位的运算
  53.         for(i = 4; i >= 0; i--)
  54.         {
  55.                 j = i + 1;   //和的下标
  56.                 cTemp = uc_TwentyFive[i] - '0' + cCarry;

  57.                 if (cTemp > 9)
  58.                 {
  59.                         cCarry = 1;
  60.                         cTemp = cTemp - 10;
  61.                 }
  62.                 else
  63.                 {
  64.                         cCarry = 0;
  65.                 }

  66.                 uc_sum[j] = cTemp + '0';
  67.                 cTemp = 0;
  68.         }

  69.         if (1 == cCarry)
  70.         {
  71.                 uc_sum[0] = '1';
  72.         }

  73.         if (0 == uc_sum[0])
  74.         {
  75.                 printf("整数和为:%s\n",&uc_sum[1]);
  76.         }
  77.         else
  78.         {
  79.                 printf("整数和为:%s\n",&uc_sum);
  80.         }
  81.         system("pause");
  82.         return 0;
  83. }
复制代码
结果如图
1111111111.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 01:50:48 | 显示全部楼层
本帖最后由 熊文杰 于 2013-6-1 01:52 编辑

20位 + 25位?还是 20位 + 20位? 25位 + 25位? 哪种?
不管哪种 先提供一下思路把,由于平台原因,不打算用int类型,全部用unsigned char类型计算。
用两个结构体,一个代表20位,一个代表25位数。如下
struct Twenty
{
    unsigned char uc_high;      //高8位
    unsigned char uc_mid;       //中8位
    unsigned char uc_low;        //低8位
}

struct TwentyFive
{
    unsigned char uc_highest;      //最高8位
    unsigned char uc_high;      //高8位
    unsigned char uc_mid;       //中8位
    unsigned char uc_low;        //低8位
}

然后分别低位与低位计算,保留进位和借位,相加判断是否有进位,有就保留到中位中去。相减则判断是不是有借位,有则保留到中位去计算。以此类推。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 06:44:48 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 09:15:15 | 显示全部楼层

我可能进错平台了,但是我们需要用VC++软件做。我不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 09:21:06 | 显示全部楼层
阳光很浅 发表于 2013-6-1 09:15
我可能进错平台了,但是我们需要用VC++软件做。我不会

20位 + 20位? 25位 + 25位? 是这种运算么?是的话,可以写个demo出来给你参考一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 09:24:12 | 显示全部楼层
阳光很浅 发表于 2013-6-1 09:15
我可能进错平台了,但是我们需要用VC++软件做。我不会

如果能把你的需求说具体点,那样最好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 09:31:42 | 显示全部楼层
熊文杰 发表于 2013-6-1 09:24
如果能把你的需求说具体点,那样最好了。

就是一个20为的整型数加上一个25位的整形数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 09:32:43 | 显示全部楼层
熊文杰 发表于 2013-6-1 09:24
如果能把你的需求说具体点,那样最好了。

我学的是C语言。不能用C++做额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 09:37:24 | 显示全部楼层
阳光很浅 发表于 2013-6-1 09:32
我学的是C语言。不能用C++做额

我貌似理解错了,你说的20位是这种比如:12345678901234567890这样的一个数?
我理解成bit的位,好吧,知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 09:39:44 | 显示全部楼层
属于大数据的范围了, 需要一定的技巧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 11:29:36 | 显示全部楼层

C:\Documents and Settings\Administrator\桌面,我复制粘贴上去有一个错。怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 11:30:05 | 显示全部楼层
本帖最后由 我是师兄 于 2013-6-1 11:31 编辑
  1. unsigned char uc_Twenty[21] = {0};         //长度为20位的整数
  2.         unsigned char uc_TwentyFive[26] = {0};     //长度为25位的整数

  3.         unsigned char uc_sum[27] = {0};            //和

  4.         memset(uc_Twenty,0,20);
  5.         memset(uc_TwentyFive,0,25);

  6.         memset(uc_sum,0,27);
复制代码
你的初始化的时候做了 ={0}
那么整个数组就被初始化为 全0了
后面三句
  1.         memset(uc_Twenty,0,20);
  2.         memset(uc_TwentyFive,0,25);

  3.         memset(uc_sum,0,27);
复制代码
[/code]是毫无意义的挥霍 一点用都没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 11:31:25 | 显示全部楼层
longdeqidao 发表于 2013-6-1 09:39
属于大数据的范围了, 需要一定的技巧。

E:\刘文强\实验.cpp(10) : error C2061: syntax error : identifier '_TCHAR'就是这个错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 11:43:04 | 显示全部楼层
我是师兄 发表于 2013-6-1 11:30
你的初始化的时候做了 ={0}
那么整个数组就被初始化为 全0了
后面三句[/code]是毫无意义的挥霍 一点用都 ...

习惯性的加这么一句,我觉得很有必要,初始化也是习惯。不觉得有什么不好的。这样可以避免很多位置的错误。有些编译器的做法可能会不一样,所以,还是谨慎点好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 11:44:41 | 显示全部楼层
阳光很浅 发表于 2013-6-1 11:31
E:\刘文强\实验.cpp(10) : error C2061: syntax error : identifier '_TCHAR'就是这个错误

你把int _tmain(int argc, _TCHAR* argv[])
这个改成int main() 就可以了,我是在vs2005里面跑的 ,所以会跟vc6有点点不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 12:01:00 | 显示全部楼层
熊文杰 发表于 2013-6-1 11:44
你把int _tmain(int argc, _TCHAR* argv[])
这个改成int main() 就可以了,我是在vs2005里面跑的 ,所以 ...

好的,谢谢了。成功了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 13:39:24 | 显示全部楼层
熊文杰 发表于 2013-6-1 11:43
习惯性的加这么一句,我觉得很有必要,初始化也是习惯。不觉得有什么不好的。这样可以避免很多位置的错误 ...

坏习惯 没必要
避免错误 应该正视错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 13:40:25 | 显示全部楼层
熊文杰 发表于 2013-6-1 11:43
习惯性的加这么一句,我觉得很有必要,初始化也是习惯。不觉得有什么不好的。这样可以避免很多位置的错误 ...

没有编译器的做法会不一样
= {0}
必然会把数组设置为全0

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 17:07:32 | 显示全部楼层
我是师兄 发表于 2013-6-1 13:40
没有编译器的做法会不一样
= {0}
必然会把数组设置为全0

不知 xcode你用过没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表