鱼C论坛

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

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

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

最佳答案

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

使用道具 举报

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

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

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

        memset(uc_Twenty,0,20);
        memset(uc_TwentyFive,0,25);
        memset(uc_sum,0,27);

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

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

        fflush(stdin);


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

                //各个位上求和
                cTemp = cCarry  + uc_Twenty[i] - '0' + uc_TwentyFive[j] - '0';
                if (cTemp > 9)
                {
                        //如果和大于9,则表示有进位
                        cCarry = 1;
                        cTemp = cTemp - 10;
                }
                else
                {
                        //如果和小于9,则表示没有进位
                        cCarry = 0;
                }

                uc_sum[k] = cTemp + '0';
                cTemp = 0;
        }

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

                if (cTemp > 9)
                {
                        cCarry = 1;
                        cTemp = cTemp - 10;
                }
                else
                {
                        cCarry = 0;
                }

                uc_sum[j] = cTemp + '0';
                cTemp = 0;
        }

        if (1 == cCarry)
        {
                uc_sum[0] = '1';
        }

        if (0 == uc_sum[0])
        {
                printf("整数和为:%s\n",&uc_sum[1]);
        }
        else
        {
                printf("整数和为:%s\n",&uc_sum);
        }
        system("pause");
        return 0;
}
结果如图
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 编辑
unsigned char uc_Twenty[21] = {0};         //长度为20位的整数
        unsigned char uc_TwentyFive[26] = {0};     //长度为25位的整数

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

        memset(uc_Twenty,0,20);
        memset(uc_TwentyFive,0,25);

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

        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-6-16 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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