回复 29楼 点线面
你用:1111
1111
试试

欢迎来到我的博客:http://blog..cn/noisunyuhong
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void rollback(char *ScL,int length_a,int length_b) //对于长度短的字符串前面填充零
{
ScL[length_a+1]='\0';
while(length_a>=0)
{
if(length_b>=0)
ScL[length_a]=ScL[length_b];
else
ScL[length_a]='0';
length_a--;
length_b--;
}
}
void Sub(char a[],char b[],char *sum,int length_a) //减法核心
{
int i;
for(i=length_a-1;i>=0;i--)
{
sum[i] = a[i]-b[i]+sum[i];
if( sum[i] <0)
{
sum[i] += +10;
if(i>0)
sum[i-1]--;
}
}
}
void prinf(char sum[],int length_a,char flag) //输出部分
{
int length_b;
if(flag)
putchar('-');
for(length_b =0 ;sum[length_b]==0&&(length_b+1<length_a);length_b++); //处理前面零
for(;length_b <length_a;length_b++) //输出
{
printf("%d",sum[length_b]);
}
}
int main()
{
char a[10]={0},b[10]={0},sum[10]={0};
int length_a,length_b;
gets(a);
gets(b);//获取字符串
length_a = strlen(a),
length_b = strlen(b);//获取字符串长度
if(length_a >length_b) //两组长度对齐,前面不足补零
{
rollback(b,length_a-1,length_b-1);
}
else
{
rollback(a,length_b-1,length_a-1);
length_a = length_b;
}
if(strcmp(a,b)>=0) //比加法增加了字符串
{
Sub(a,b,sum,length_a);
prinf(sum,length_a,0);
}
else
{
Sub(b,a,sum,length_a);
prinf(sum,length_a,1);
}
system("pause");
return 0;
}之前第一次发时候OK的,后期觉得还要更短就进行编辑,发觉越改越错,今次应该没有问题,
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
short int sum[1000],length=0;//sum为结果,length为位数的长短
int cmp(int a[],int b[],int a_length,int b_length){
int i;
if(a_length>b_length)return 1;//如果a串长度比b串长度大,返回1
if(a_length<b_length)return -1;//如果a串长度比b串长度小,返回-1
for(i=a_length-1;i>=0;i--){
if(a[i]>b[i])return 1;//如果a串数值比b串数值大,返回1
if(a[i]<b[i])return -1;//如果a串数值比b串数值小,返回-1
}
return 0;//如果两数相等,返回0
}
int sub(int a[],int b[],int a_length,int b_length){
int flag,i;//flag位标记
length=a_length;//将a的长度赋给总长度
flag=cmp(a,b,a_length,b_length);//从cmp中获得两串信息
if(flag==0){
memset(a,0,sizeof(a));//将数组置0
return 0;//返回相等标记
}
if(flag==1){//如果a串长度比b串长度大 或 如果a串数值比b串数值大,返回1
//减法核心
for(i=0;i<length;i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
a[i]=a[i]-b[i];
while(a[length]==0)length--;//获取减去后的长度并返回1
}
return 1;
}
//end
if(flag==-1){//如果a串长度比b串长度小 或 如果a串数值比b串数值小,返回-1
for(i=0;i<b_length;i++){
if(b[i]<a[i])
{
b[i+1]--;
b[i]+=10;
}
a[i]=b[i]-a[i];
}
length=b_length;
while(a[length]==0)length--;
return -1;
}
}
int main(){
char a[500],b[500];//用来读入两个串
int A[500]={0},B[500]={0},i,k;
int a_length,b_length;
gets(a),gets(b);//获取两个数
a_length=strlen(a);//获取数字a的长度
b_length=strlen(b);//获取数字b的长度
for(i=0;i<a_length;i++)
A[i]=a[a_length-i]-'0';//由数组A来保存获得的a每个字符的数值
for(i=0;i<b_length;i++)
B[i]=b[b_length-i]-'0';//由数组B来保存获得的b每个字符的数值
if(cmp(A,B,a_length,b_length)==0)//判断两串是否相等
{
printf("0\n"); //两数相等相减就等于0
system("pause");
return 0;//退出程序
}
k=sub(A,B,a_length,b_length);//k为标记是否为负数
if(k==-1)//判断a-b是否是负数
printf("-");//是负数就在将要打印的数字前加上负号
for(i=length-1;i>=0;i--)
printf("%d",A[i]);//打印相减后的结果,因为一开始没有将串倒置,所以倒着输出
system("pause");
return 0;
}
