c语言-C语言中,我想依次读入两个非常大的数,用字符串存,

问题描述

C语言中,我想依次读入两个非常大的数,用字符串存,

C语言中,我想依次读入两个非常大的整数,用字符串存,应该怎么写读入语句,并且想计算他们的和,并输出结果,应该怎么办(这两个整数非常大,long int也不能存)

解决方案

/**********  main function *********/

/*
** FILE:     tbigint.c
** NOTE:     2015-10-08 created by Jack Liu
*/
#include<stdio.h>
#include<string.h>
#include"bigint.h"

int
main( void )
{
        char caOper1[ 100 ] = { 0 };
        char caOper2[ 100 ] = { 0 };
        st_bigint stOper1;
        st_bigint stOper2;
        st_bigint stResult;

        stOper1.iFlag = POSITIVE;
        stOper1.iUsed = 0;
        memset( stOper1.iaValue, 0x00, sizeof( stOper1.iaValue ) );

        memcpy( &stOper2, &stOper1, sizeof( st_bigint ) );
        memcpy( &stResult, &stOper1, sizeof( st_bigint ) );

        printf( "input operand 1: " );
        scanf( "%s", caOper1 );
        printf( "input operand 2: " );
        scanf( "%s", caOper2 );

        str2bigint( caOper1, &stOper1 );
        str2bigint( caOper2, &stOper2 );

        printf( "first operand : " );
        print_bigint( &stOper1 );
        printf( "n" );
        printf( "second operand: " );
        print_bigint( &stOper2 );
        printf( "n" );

        add_bigint( &stOper1, &stOper2, &stResult );
        printf( "result output : " );
        print_bigint( &stResult );
        printf( "n" );

        return 0;
}

/************************************/
/************** detail **************/
/***********************************/
/*
** FILE:    bigint.h
** NOTE:    2015-10-08 created by Jack Liu
*/
#ifndef JACK_LIU_COM_BIGINT_H
#define JACK_LIU_COM_BIGINT_H

#define DIGITS_NUM 100
#define NEGATIVE   -1
#define POSITIVE   1

typedef struct _st_bigint
{
        int iaValue[ DIGITS_NUM + 1 ];
        int iUsed;
        int iFlag;
} st_bigint;

int get_digits_of_int( unsigned int iInteger );
int str2bigint( const char *ccpStr, st_bigint *stpBigint );
int add_bigint( st_bigint *stpOper1, st_bigint *stpOper2, st_bigint *stpResult );
int print_bigint( st_bigint *stpResult );

#endif

/*
** FILE:    bigint.c
** NOTE:    2015-10-08 created by Jack Liu
*/
#include<stdio.h>
#include<string.h>
#include<limits.h>
#include"bigint.h"

int
get_digits_of_int( unsigned int iInteger )
{
        int iCnt = 1;

        iInteger = iInteger > 0 ? iInteger : -iInteger;

        while( ( iInteger /= 10 ) > 0 )
                ++iCnt;

        return iCnt;
}

int
str2bigint( const char *ccpStr, st_bigint *stpBigint )
{
        int iStrLen = strlen( ccpStr );
        int iIntLen = get_digits_of_int( INT_MAX );
        int iTmpInt = 0;
        int iTmpPos = 0;
        int i = 0;

        if( ccpStr[ 0 ] == '-' )
                stpBigint->iFlag = NEGATIVE;
        else
        {
                stpBigint->iFlag = POSITIVE;
                iTmpInt = *( ccpStr ) - '0';
                iTmpPos++;
        }

        for( i = 1; i < iStrLen; ++i )
        {
                iTmpInt = iTmpInt * 10 + *( ccpStr + i ) - '0';
                if( ++iTmpPos == iIntLen - 1 )
                {
                        stpBigint->iaValue[ stpBigint->iUsed++ ] = iTmpInt;
                        iTmpInt = 0;
                        iTmpPos = 0;
                }
        }

        if( iTmpInt > 0 )
                stpBigint->iaValue[ stpBigint->iUsed++ ] = iTmpInt;

        return 0;
}

static int
get_int_carry( unsigned int uiResult, int iLimLen, int *ipRemain )
{
        int i = 0;
        unsigned int uiTmpResult = uiResult;
        unsigned int uiTmpConvert = 0;

        /*
        ** after for loop, uiTmpResult contain the carry value
        */
        for( i = 0; i < iLimLen; ++i )
                uiTmpResult /= 10;

        /*
        ** build a tmp value with the carry value
        */
        uiTmpConvert = uiTmpResult;
        for( i = 0; i < iLimLen; ++i )
                uiTmpConvert *= 10;

        /*
        ** caculate the remain without the carry part
        */
        if( ipRemain != NULL )
        {
                *ipRemain = uiResult - uiTmpConvert;
        }

        return ( int )uiTmpResult;
}

int
add_bigint( st_bigint *stpOper1, st_bigint *stpOper2, st_bigint *stpResult )
{
        unsigned int uiTmpResult = 0;
        int iIntLen = get_digits_of_int( INT_MAX );
        int iTmpCarry = 0;
        int iCalcuCnt = stpOper1->iUsed > stpOper2->iUsed ? stpOper2->iUsed : stpOper1->iUsed;
        int iCarryCnt = stpOper1->iUsed > stpOper2->iUsed ? stpOper1->iUsed : stpOper2->iUsed;

        if( stpOper1->iFlag == POSITIVE && stpOper2->iFlag == POSITIVE )
        {
                int i = 0;
                int j = 0;
                int iTmpResultLen = 0;
                stpResult->iUsed = iCarryCnt + 1;
                for( i = iCalcuCnt; i > 0; --i )
                {
                        uiTmpResult = stpOper1->iaValue[ stpOper1->iUsed - 1 - j ] + stpOper2->iaValue[ stpOper2->iUsed - 1 - j ] + iTmpCarry;
                        iTmpCarry = 0;
                        iTmpResultLen = get_digits_of_int( uiTmpResult );
                        if( iTmpResultLen >= iIntLen )
                                iTmpCarry = get_int_carry( uiTmpResult, iIntLen, &( stpResult->iaValue[ stpResult->iUsed - 1 - j ] ) );
                        else
                                stpResult->iaValue[ stpResult->iUsed - 1 - j ] = uiTmpResult;
                        j++;
                } 

                for( i = stpOper1->iUsed - iCalcuCnt, j = 0; i > 0; --i )
                {
                        uiTmpResult = stpOper1->iaValue[ stpOper1->iUsed - 1 - iCalcuCnt - j ] + iTmpCarry;
                        iTmpCarry = 0;
                        iTmpResultLen = get_digits_of_int( uiTmpResult );
                        if( iTmpResultLen >= iIntLen )
                                iTmpCarry = get_int_carry( uiTmpResult, iIntLen, &( stpResult->iaValue[ stpResult->iUsed - 1 - iCalcuCnt - j ] ) );
                        else
                                stpResult->iaValue[ stpResult->iUsed - 1 - iCalcuCnt - j ] = uiTmpResult;
                        j++;
                }

                for( i = stpOper2->iUsed - iCalcuCnt, j = 0; i > 0; --i )
                {
                        uiTmpResult = stpOper1->iaValue[ stpOper2->iUsed - 1 - iCalcuCnt - j ] + iTmpCarry;
                        iTmpCarry = 0;
                        iTmpResultLen = get_digits_of_int( uiTmpResult );
                        if( iTmpResultLen >= iIntLen )
                                iTmpCarry = get_int_carry( uiTmpResult, iIntLen, &( stpResult->iaValue[ stpResult->iUsed - 1 - iCalcuCnt - j ] ) );
                        else
                                stpResult->iaValue[ stpResult->iUsed - 1 - iCalcuCnt - j ] = uiTmpResult;
                        j++;
                }

                if( iTmpCarry > 0 )
                        stpResult->iaValue[ 0 ] = iTmpCarry;
                else
                {
                        for( i = 1; i < stpResult->iUsed; ++i )
                                stpResult->iaValue[ i - 1 ] = stpResult->iaValue[ i ];
                        stpResult->iUsed--;
                }
        }

        return 0;
}

int print_bigint( st_bigint *stpResult )
{
        int i = 0;

        if( stpResult->iFlag == NEGATIVE )
                printf( "-" );

        for( i = 0; i < stpResult->iUsed; ++i )
        {
                printf( "%d", stpResult->iaValue[ i ] );
        }

        return 0;
}

![图片说明](http://img.ask.csdn.net/upload/201510/09/1444322973_353727.png)

解决方案二:

一开始读入的时候就以字符串的形式来读。但是你这个问题,两个整数非常大,那他的和不是更大?你可以试试bigint这个类型。

解决方案三:

struct biginteger
{
int digit[500];
int len;
}
读进去之后转换一下,存进biginteger类型的变量里。用数组高精度计算的方法做

解决方案四:

可以用整形数组来实现

解决方案五:

解决方案六:

用数组来存啊,例如这样:10000=0*1+0*10+0* 100+0*1000+1*10000

时间: 2024-09-27 14:08:54

c语言-C语言中,我想依次读入两个非常大的数,用字符串存,的相关文章

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指

c语言-C语言中,关于printf的问题!

问题描述 C语言中,关于printf的问题! 程序如下,为什么打印p时候值是不确定的?我知道正确的写法是 * p,但是我想知道 直接打印p为什么不报错,也没警告,但是值却不确定? #include <stdio.h> int main() { int a =8; int *p = &a printf("%dn",p); } 解决方案 printf("%dn",p) 代表指针p所指向的变量的地址值,所以不报错,你输出的是整型变量a的地址值,要想输出

c语言-C语言中,如何用*画出一些图案!感觉没有思路!表达式和图案的联系

问题描述 C语言中,如何用*画出一些图案!感觉没有思路!表达式和图案的联系 C语言中,如何用*画出一些图案!感觉没有思路!表达式和图案的联系 解决方案 你可以试试看现在纸上设计下草图,照着位置放不就可以了?如果想用复杂点的表达式之类的,也可以看一看图形学的一些图形算法,把每一个星号的位置当做像素点putpixel来处理 解决方案二: 细心观察,找规律啊. 关键还得有设计思路. 解决方案三: 不知道要什么样的图案,一般提问的都是三角形梯形菱形四边形这些相对较简单也易实现代码编写.http://bl

c语言-C语言中select函数 应用于网络存储中配合fread/fwrite是否存在阻塞问题

问题描述 C语言中select函数 应用于网络存储中配合fread/fwrite是否存在阻塞问题 利用fread fwrite 读写网络存储上的文件时,是否会出现阻塞问题? 我的感觉是会出现但是无法通过select判断,因为select判断的是内容是否存在,就是文件是否存在,而对于文件fread fwrite没有发现文件也会报错 但是一旦文件存在开始读写以后发生了网络传输中断引起阻塞 那么还是会挂住 而所谓的非阻塞机制无法发挥作用 不知道我的理解是否正确? 谢谢大家发表看法. 解决方案 阻塞和非

c语言-C语言中Free函数释放内存为何释放不了!!!!!!!

问题描述 C语言中Free函数释放内存为何释放不了!!!!!!! #include #include void testFree(char *par) { void*free(par); par = NULL; } int _tmain(int argc, _TCHAR* argv[]) { char path[10] = {"abc"}; char *str = (char *) malloc(100 *sizeof(char)); memset(str,0x00,100 *size

c语言-C语言中scanf函数问题

问题描述 C语言中scanf函数问题 #include<stdio.h> int main() { char a1[5],a2[5],a3[5],a4[5]; scanf("%s",a1); printf("END1"); scanf("%s",a2); printf("END2"); scanf("%s",a3); printf("END3"); scanf("%

语言 break-C 语言中break跳出问题

问题描述 C 语言中break跳出问题 书上写的break对if else 不起作用.可是我写代码的时候发现使用break跳出了if else 循环.请问这是什么原因.书上讲的是对的吗? 解决方案 首先if else不是循环语句,是分支语句,break是用来跳出当前循环,其次,你是不是在循环语句里面写了if-else语句呢,如果是的话,那就对了,break直接跳出当前循环,这与if-else无关呢.不畏浮云遮望眼,只缘身在最高层. 解决方案二: 首先if else不是循环语句,是分支语句,bre

c语言-C语言中 c=fgetc(fp)!=EOF这个表达式的结合顺序是什么?

问题描述 C语言中 c=fgetc(fp)!=EOF这个表达式的结合顺序是什么? 我想要的结果应该这么写:(c=fgetc(fp))!=EOF 解决方案 先进行fgetc(fp)!=EOF的true/false,再把true/false赋值给c. 解决方案二: 先进行fgetc(fp)!=EOF的true/false,再把true/false赋值给c.

c语言-C语言中的float数据类型

问题描述 C语言中的float数据类型 C语言中的float数据用32位存储,其中有6位为小数位,那么小数点后的值应该不超过2^6-1,而实际上却是保留小数点后6位,这是怎么回事? 解决方案 你的问题本身就不对,float的位数精度是23位,也就是1/2^23,折算成10进制,在1/10^6.x,为了不丢失最后的那一点精度,所以用7位表示尾数而不是6位.http://blog.csdn.net/dxy612/article/details/5518477 解决方案二: 首先我的观点同上,补充一点