大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。
一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。
七 百位大数。
百位大数...让人又爱又恨阿。 ?回想去年,初学c语言,实验就有这个。
那时候折腾老久了。 ? ? ? ? ? ?刻苦铭心呀。
写这篇博客,没其他意思,主要是为了回忆回忆,然后记录一下当初的代码,便于以后翻看。
代码是大一上学期写的。可能比较水,大神们勿喷,纯属自己娱乐罢了。
?
实验题目:
此次实验要求利用数组实现两个百位大数(共有100位数字)的加、减、乘法的运算。 实现下列三个函数的功能(以下函数应在fun.h中声明,在fun.c中实现) ? 函数原型:
/*实现两个大数的相加*/ ?? char* add(char* data,char* addend,char* result);
/*实现两个大数的相减*/ ?? char* minus(char* data,char* sub,char* result);
/*实现两个大数的相乘*/ ?? char* multiply(char* data,char* mult,char* result);
?
实验内容:
在给出的程序框架中完成实验题目。 mylib.c包括此次实验的程序框架。 ?(在给出的程序框架中补充设计并完成实验。)
注:检验计算结果是否正确可利用提供的 test.exe 文件。 在mylib.exe和test.exe文件中输入相同的种子则会产生相同的随机大数。可以用test.exe产生的结果和mylib.exe对照结果检验对错。
请注意其中test.exe文件的输出格式和框架规定的输出格式有所不同。
?
提示:
字符型与整型转换
1.可以模拟笔算加减乘的过程,用数组储存大数; 2.可以用atoi和itoa函数; 3.对于一位整数的整型转换为字符型:
例: char c; int i = 9; c = i+’0’; printf(“%c”,c);
?
main.c
- ?
- ?
- ???学号:****?
- ???功能:百位大数?
- ???时间:2012.12.2??*/??
- #include?<stdio.h>??
- #include?<stdlib.h>??
- #include?<string.h>??
- #include?"fun.h"??
- ??
- #define?N?100??
- /*?产生随机的大数??*/??
- void?create(char*?num,?unsigned?seed);????
- ??
- char?result[2?*?N]?=?{' '};??
- int?main(void)??
- {??
- ????char?num[N];??
- ????char?n[N];??
- ??????
- ????unsigned?int?seed;??
- ????printf("Please?input?a??rand?seed:");??
- ????scanf("%u",?&seed);??
- ????printf("nThe?seed?is?%un",?seed);??
- ????
- ????create(num,?seed);??
- ????create(n,?seed+1);??
- ????printf("***********************************************n");??
- ????printf("num:?%sn?n?:?%sn",?num,?n);??
- ??????
- ????add(num,?n,?result);??
- ????printf("num?+?n?=?%sn",?result);??
- //调用减法??
- ????minus(num,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????printf("num?-?n?=?%sn",0); background-color:inherit">//调用乘法??
- ????multiply(num,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????printf("num?*?n?=?%sn",248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????system("pause");??
- ????return?0;??
- }??
- char?num[],?unsigned?seed)??
- int?i?=?0,?x?=?0;??
- int?times,?flag?=?1;??
- ????srand(seed);??
- ????times?=?rand()?%?(N?-?2)?+?1;??
- ????if(rand()?%?2)??
- ????????num[i]?=?'-';??
- ????????i++;??
- ????????if(times?==?1)??
- ????????????times++;??
- ????}??
- while(flag)??
- ????{??
- ????????x?=?rand()?%?10;??
- if(x?!=?0)??
- ????????{??
- ????????????flag?=?0;??
- ????????}??
- ????num[i]?=?x?+?'0';??
- ????i++;??
- for(;?i?<?times;?i++)??
- ????????num[i]?=?x?+?'0';??
- ????}??
- ????num[times]?=?' ';??
- }??
fun.h
#ifndef?FUN_H_INCLUDED??
- #define?FUN_H_INCLUDED??
- //此方法实现加法运算??
- char*?add(char*?data,?char*?addend,87); background-color:inherit; font-weight:bold">char*?result);??
- //此方法实现减法运算??
- char*?minus(char*?sub,87); background-color:inherit; font-weight:bold">char*?result);??
- //此方法实现乘法运算??
- char*?multiply(char*?mult,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> #endif?//?FUN_H_INCLUDED??
fun.c
#include<stdio.h>??
- #include<stdlib.h>??
- #include"fun.h"??
- #include<string.h>??
- #define?N?100??
- //在此添加加法的实现??
- char*?result)??
- {??
- int?i=0,a1,a2;??
- char?pdata[2*N]={' '};??
- char?padden[2*N]={' '};??
- ????a1=strlen(data);??
- ????a2=strlen(addend);??
- ????strcpy(pdata,data);??
- ????strcpy(padden,addend);??
- for(i=0;result!=' '&&i<2*N;i++)??
- ????{??
- ??????result[i]=' ';??
- if(pdata[0]!='-'&&padden[0]!='-')??
- ??????if(a1?>=?a2)??
- ??????{??
- for(;a2>0;a2--,a1--)??
- ??????????result[a1-1]=pdata[a1-1]+padden[a2-1]-'0';??
- ??????????if(result[a1-1]>'9'&&(a1-1)>0)??
- ??????????{??
- ????????????result[a1-1]?-=?10;??
- ????????????pdata[a1-2]++;??
- ??????????}??
- ????????}??
- ????????for(;a1>=1;a1--)??
- ????????{??
- ??????????result[a1-1]=result[a1-1]+pdata[a1-1];??
- ??????????if(result[a1-1]>'9'&&(a1-1)>0)??
- ??????????{??
- ????????????result[a1-1]-=10;??
- ????????????pdata[a1-2]++;??
- ??????????}??
- if(result[0]>'9')??
- ??????????a1=strlen(data);??
- for(;a1>0;a1--)??
- ????????????result[a1]=result[a1-1];??
- ??????????result[1]-=10;??
- ??????????result[0]='1';??
- ??????}??
- ??????else?if(a1<a2)??
- ??????{???????add(addend,data,result);??
- ??????}??
- if(pdata[0]=='-'&&padden[0]=='-')???
- ??????result[0]='-';??
- ??????add(&data[1],&addend[1],&result[1]);??
- if(pdata[0]!='-'&&padden[0]=='-')??
- ??????minus(pdata,&padden[1],153); background-color:inherit; font-weight:bold">else???
- ??????add(addend,153); background-color:inherit; font-weight:bold">return?result;??
- }??
- char*?result)??
- int?i,b1,b2,p,dif;??
- char?pdata[N]={' '},?psub[N]={' '};??
- ????strcpy(psub,sub);??
- for(i=0;result[i]!=' '&&i<N;i++)
- ????b2=strlen(psub);??
- if(pdata[0]!='-'&&psub[0]!='-')??
- if(b1>b2)??
- for(;b2-1>=0;b1--,b2--)??
- ?{??
- ??????????result[b1-1]=pdata[b1-1]-psub[b2-1]+'0';??
- if(result[b1-1]<'0')??
- ????????????result[b1-1]+=10;??
- ????????????pdata[b1-2]--;??
- ????????p=b1;??
- while?(pdata[p-1]<'0'&&p>1)??
- ??????????pdata[p-1]+=10;??
- ??????????pdata[p-2]--;??
- ??????????p--;??
- if(b1>1)??
- for(;b1>0;b1--)??
- ????????????result[b1-1]=pdata[b1-1];??
- while?(result[0]=='0')??
- ??????????b1=strlen(pdata);??
- for(i=0;i<=b1;i++)??
- ????????????result[i]=result[i+1];??
- if(b1?<?b2)
- ?}??
- else??
- if(pdata[0]!=psub[0])??
- for(i=0;pdata[i]!=psub[i];i++)??
- ???????{??
- ??????????;??
- ???????}??
- ???????dif=i;??
- else??
- ??????{??
- ????????dif=0;??
- if(pdata[dif]>psub[dif])??
- for(i=(?b1-dif?)?;?i?>?0?;?i?--,b1--,dif--)??
- ??????????result[b1-dif-1]?=pdata[?b1-1?]?+'0'-?psub[b2-1];??
- if(result[b1-dif-1]?<?'0')??
- ????????????pdata[?b1-2?]--;??
- ????????????result[b1-dif-1]?+=?10;??
- //当两个数组第一位数值相同,减去得到的结果为0??
- for(i?=?0?;i?<?b1-dif?;?i++)??
- ????????????result[i]=result[i+1];??
- if(pdata[dif]?<?psub[dif])??
- ????????result[0]='-';??
- for(i?=?b1;i?>?0?;?i--)??
- ??????????pdata[i]?=?pdata[i-1];??
- ??????????pdata[0]?=?'-';??
- ??????????add(psub,&pdata[1],0); background-color:inherit">//调用加法函数add()??
- //当第一个数组中元素对应数值等于相同位的第二个数组中的元素??
- ????????result[0]='0';??
- ????????result[1]=' ';??
- ???}??
- ???if(pdata[0]=='-'&&psub[0]!='-')??
- ???{??
- ?????result[0]='-';??
- ?????add(&pdata[1],psub,108); list-style:decimal-leading-zero outside; color:inherit; line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ???}??
- ???if(pdata[0]!='-'&&psub[0]=='-')
- ???{??
- ????add(pdata,&psub[1],153); background-color:inherit; font-weight:bold">else??
- ????minus(&sub[1],&data[1],result);??
- }??
- //在此添加乘法的实现??
- ?char?*multiply(int?digit,i,k,c1,c2,c3,num;??
- char?pdata[N]={' '};??
- char?pmult[N]={' '};?array[2*N]={' '};??
- ????strcpy(pdata,0); background-color:inherit">//将字符串data复制到字符数组pdata[N]中??
- ????strcpy(pmult,mult);??
- ????c1=strlen(data);??
- ????c2=strlen(mult);??
- for(i=0;result[i]!=' '&&i<2*N;i++)??
- ??????result[i]=' ';??
- if(pdata[0]!='-'&&pmult[0]!='-')??
- for(i=c1-1;i>=0;i--)??
- ????????digit=c1-i-1;??
- ????????num=pdata[i]-'0';??
- if(num>0)??
- for(k=0;array[k]!=' '&&k<2*N;k++)??
- ????????????array[k]=' ';??
- for(;num>0;num--)??
- ????????????add(array,pmult,array);??
- ???????????c3=strlen(array);??
- for(;digit>0;digit--)??
- ????????????array[c3+digit-1]='0';??
- ??????????add(array,result,0); background-color:inherit">//需将array[]中的元素错位累加即可得到最终相乘的结果??
- if(pdata[0]=='-'&&pmult[0]!='-')
- ??????result[0]='-';??
- ??????multiply(&pdata[1],&result[1]);??
- if(pdata[0]!='-'&&pmult[0]=='-')
- ??????result[0]='-';??
- ??????multiply(pdata,&pmult[1],153); background-color:inherit; font-weight:bold">if(pdata[0]=='-'&&pmult[0]=='-')??
- ??????multiply(&pdata[1],108); list-style:decimal-leading-zero outside; color:inherit; line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> }??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|