首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

课程设计题目:超长整数处理,该如何解决

2012-09-10 
课程设计题目:超长整数处理32课程设计题目:超长整数处理2*(由完成)课程设计内容:用C语言编写程序完成以下

课程设计题目:超长整数处理
32课程设计题目:超长整数处理2*(由 完成)
课程设计内容:用C语言编写程序完成以下任务:
采用链表来表示一个带符号的超长整数(20位以上)。并且进行如下处理。
将超长整数s按3位为一组分割,该三位数相加,并替换原来的三位数,构成一个新数(不考虑进位)。显示并存在文件file32.txt中。例如,当s为870539421768945时,显示的数为:57718。
提示:超长整数要用字符串实现输入,按3位截取,转成整型存放在链表中(每个节点存放3位,如870-539-421-768-945),然后即可处理。
课程设计要求:
1.贯彻结构化程序设计思想。
2.用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
3.用户界面中的菜单至少应包括“输入超长整数”、“运算”、“退出”3项。
4.代码应适当缩进,并给出必要的注释,以增强程序的可读性。
  大家帮帮忙,这个是个新题,我想了很多天了,总是出错,还有几天就要交程序了,如果交不上可能要挂科,过年还得学!麻烦了,求高人帮忙!我QQ848782824 ,可以发到我的邮箱里面!也可以发到这个上面

[解决办法]
我以前写的,用数组,自己看方法,自己改成符合你的要求就可以了。

C/C++ code
//大数相乘#include<stdio.h>#include<string.h>#include<malloc.h>#define MaxLen 50/*#define DEBUG*/int main(int argc,char *argv[]){    char inLeft[MaxLen],inRight[MaxLen];    int m,n;    int i,j,k,r,sum,increat;    int *Left,*Right,**Result;    int loc;        //填入位置    printf("\nInput the left number : ");    scanf("%s",inLeft);    printf("Input the right number : ");    scanf("%s",inRight);    #ifdef DEBUG    printf("\nLeft number = %s , Right number= %s  \n",inLeft,inRight);    #endif    m=strlen(inLeft);    n=strlen(inRight);    #ifdef DEBUG    printf("Length of left number is : %d  , right is : %d \n",m,n);    #endif        //allocate space    Left=(int *)malloc(m*sizeof(int));    Right=(int *)malloc(n*sizeof(int));    Result=(int **)malloc((n+1)*sizeof(int *));    for(i=0;i<n+1;i++)    {        Result[i]=(int *)malloc((m+n)*sizeof(int));    }    //initialize    for(i=0;i<m;i++)    {        Left[i]=(int)inLeft[i]-48;    }    for(i=0;i<n;i++)    {        Right[i]=(int)inRight[i]-48;    }    for(i=0;i<n+1;i++)    {        for(j=0;j<m+n;j++)        {            Result[i][j]=0;        }    }        //test initialize    #ifdef DEBUG    printf("\nLeft is : \n");    for(i=0;i<m;i++)    {        printf("%3d",Left[i]);    }    printf("\nRight is : \n");    for(i=0;i<n;i++)    {        printf("%3d",Right[i]);    }    printf("\nResult is : \n");    for(i=0;i<n+1;i++)    {        for(j=0;j<m+n;j++)        {            printf("%3d",Result[i][j]);                }        printf("\n");    }    #endif    //运算    loc=m+n-1;    k=n-1;    for(i=0;i<n;i++)    {            r=loc;        increat=0;        for(j=m-1;j>=0;j--)        {            Result[i][r]=(Left[j]*Right[k]+increat)%10;            increat=(Left[j]*Right[k]+increat)/10;            r--;        }        if(increat!=0)        {            Result[i][r]=increat;        }        loc--;        k--;    }    //计算最终结果    increat=0;    for(i=m+n-1;i>=0;i--)    {        sum=0;        for(j=n-1;j>=0;j--)        {            sum+=Result[j][i];        }        Result[n][i]=(sum+increat)%10;        increat=(sum+increat)/10;    }    if(increat!=0)    {        Result[n][i]=increat;    }    //test caculate    #ifdef DEBUG    printf("\nResult is : \n");    for(i=0;i<n+1;i++)    {        for(j=0;j<m+n;j++)        {            printf("%3d",Result[i][j]);                }        printf("\n");    }    #endif    printf("\n%s * %s = ",inLeft,inRight);    for(i=0;i<m+n;i++)    {        if(Result[n][i]!=0)        {                for(j=i;j<m+n;j++)            {                printf("%d",Result[n][j]);            }            break;        }    }    printf("\n");    //free space     if(Left!=NULL)    {        free(Left);        Left=NULL;    }    if(Right!=NULL)    {        free(Right);        Right=NULL;    }    if(Result[0]!=NULL)    {        for(i=0;i<n+1;i++)        {            free(Result[i]);            Result[i]=NULL;        }    }    if(Result!=NULL)    {        free(Result);        Result=NULL;    }    return 0;} 

热点排行