回复 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;
}
