当前位置:文档之家› 高精度加法

高精度加法

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限
作业名称:
高精度加法 学 院:
班 级:
学 号:
姓 名:
团队组成: 无
大学
2015年11月23日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。

1、问题与背景(描述程序所要解决的问题或应用背景)
2、开发工具(列出所使用的开发工具和第3方开发库)
3、主要功能(详细说明程序的功能)
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
6、函数模块(程序中各个函数的原型声明及其说明)
7、使用说明(运行程序的小型说明书)
8、程序开发总结(简要叙述编写本作业的收获与思考)
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。

或者使用HyperSnap等软件(百度搜索)。

10、源程序(附上程序源代码,若是多个文件,标出文件名)
源文件:高精度加法\main.cpp
源代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void add(const char *num1,const char *num2,char *result);
int main()
{
char s[100]={0},argv1[100]={0},argv2[100]={0};
int a=1;
cout<<"本程序用于两个数的高精度加法计算,允许正负号"<<endl;
cout<<endl<<endl;
while (a)
{
cout<<"请分别输入两个100位以内的数字,以回车结束"<<endl;
gets(argv1);
gets(argv2);
cout<<endl;
cout<<"下面将输出两数的和"<<endl;
add(argv1,argv2,s);
cout<<s<<endl<<endl;
cout<<"继续请输入1,结束请输入0"<<endl;
cin>>a;
cout<<endl;
if (a)
{
s[100]={0},argv1[100]={0},argv2[100]={0};
cout<<"请按回车以继续"<<endl;
getchar(),getchar();
cout<<endl;
}
}
return 0;
}
int ctoi(char c)
{
return (c-'0');
}
void _add(const char *num1,const char *num2,char *result) {
int i,j,k,n1,n2,n;
int sig,sta,car,len1,len2;
char c[100]={0};
sig=(*num1=='-')?-1:1,sta=(sig==-1)?1:0;
len1=strlen(num1),len2=strlen(num2);
if (len1>=len2)
{
j=len2-1;
k=0,car=0;
for (i=len1-1;i>=sta;i--)
{
n1=ctoi(num1[i]);
n2=(j>=sta)?(ctoi(num2[j])):0;
j--;
n=(car==1)?(n1+n2+1):(n1+n2);
if (n>9) n=n%10,car=1;
else car=0;
c[k]=n+'0';
k++;
}
if (car==1) c[k]=1+'0',k++;
}
else
{
j=len1-1;
k=0,car=0;
for (i=len2-1;i>=sta;i--)
{
n2=ctoi(num2[i]);
n1=(j>=sta)?(ctoi(num1[j])):0;
j--;
n=(car==1)?(n1+n2+1):(n1+n2);
if (n>9) n=n%10,car=1;
else car=0;
c[k]=n+'0';
k++;
}
if (car==1) c[k]=1+'0',k++;
}
i=0;
if (sig==-1) result[i]='-',i++;
for (j=k-1;j>=0;j--) result[i]=c[j],i++;
}
void _sub(const char *num1,const char *num2,char *result)
{
int i,j,k,n1,n2,n;
int sig,sta1,sta2,car,len1,len2;
char c[100]={0};
sig=(*num1=='-')?-1:1,sta1=(*num1=='-')?1:0,sta2=(*num2=='-')?1:0;
len1=strlen(num1),len2=strlen(num2);
j=len2-1,k=0,car=0;
for (i=len1-1;i>=sta1;i--)
{
n1=ctoi(num1[i]);
n2=(j>=sta2)?(ctoi(num2[j])):0;
j--;
if (car==1) n1=n1-1,car=0;
if (n1<n2) n=n1+10-n2,car=1;
else n=n1-n2;
c[k]=n+'0';
k++;
}
i=0;
if (sig==-1) result[i]='-',i++;
for (j=k-1;j>=0;j--) result[i]=c[j],i++;
}
void add(const char *num1,const char *num2,char *result) {
int i,j,bigger=0;
int sig1,sig2,sta1,sta2,len1,len2;
sig1=(*num1=='-')?-1:1,sig2=(*num2=='-')?-1:1;
sta1=(sig1==-1)?1:0,sta2=(sig2==-1)?1:0;
len1=strlen(num1),len2=strlen(num2);
if (sig1==sig2) bigger=-1;
else if ((len1-sta1)>(len2-sta2)) bigger=1;
else if ((len1-sta1)<(len2-sta2)) bigger=2;
else
{
for (i=sta1;i<len1;i++)
{
j=sta2;
if (num1[i]>num2[j])
{
bigger=1;
break;
}
else if (num1[i]<num2[j])
{
bigger=2;
break;
}
j++;
}
}
switch (bigger)
{
case 0: result[0]='0'; break;
case -1: _add(num1,num2,result); break;
case 1: _sub(num1,num2,result); break;
case 2: _sub(num2,num1,result); break;
default: break;
}
}。

相关主题