/*
计算表达式的值:
-1+2-3+4-5+6…+n*(-1)n=?
要求:在界面输入n的值,运算后返回结果。
注意:n的值可能很大,甚至超过long的范围。
n的输入只能为非负整数,应该控制其它非法符号的输入。
*/
#include <stdio.h>
#include <string.h>
int main()
{
int i,j,k,len,lenb,lenc;
int roll = -1;
int f = 1;//符号位处理
char a[99] = {0};
char b[100]="1";
char c[100] = {0};//计算结果记录
bool tag = true,flag=true;
puts("请输入一个非负整数:");
gets(a);
//判断输入有效性
for( i=0; a[i]!='\0'; i++ )
{
if( a[i]<'0' || a[i]>'9' )
{
tag = false;
break;
}
}
if ( !tag )
{
puts("Invalid Input!");
return 1;
}
//初始化C,避免过程中出现负数问题
len = strlen(a);
for( i=0; i<len; i++ )
{
c[i] = a[i];
}
c[len] = '\0';
do
{
lenb = strlen(b);
f = f*roll;
lenc = strlen(c);
//将b[j]的每一位都加到c[j]中,作为计算和
for( j=lenb-1,k=lenc-1; j>=0; j--,k-- )
{
c[k] += f*(b[j]-'0');
}
//判断是否满足b<=a
for( i=0; i<len; i++ )
{
if(a[i]>b[i])
{
flag = true;
break;
}
else if( a[i]==b[i] && i==len-1 )
{
flag = false;
break;
}
}
//c的进退位处理
lenc = strlen(c);
for(i=lenc-1; i>0; i--)
{
if (c[i]>'9')
{
c[i] -= 10;
c[i-1] += 1;
}
else if (c[i]<'0')
{
c[i] += 10;
c[i-1] -= 1;
}
}
lenb = strlen(b);
//循环递加1
b[lenb-1] += 1;
for( j=lenb-1; j>0; j-- )
{
if(b[j]>'9')
{
b[j] = b[j] - 10;
b[j-1] += 1;
}
}
if (b[0]>'9')
{
for( j=lenb; j>1; j-- )
{
b[j] = b[j-1];
}
b[lenb+1] = '\0';
b[1] = b[0] - 10;
b[0] = '1';
}
} while(flag);
//判断是否满足c>a
lenc = strlen(c);
len = strlen(a);
if(len == lenc)
{
for( i=0; i<lenc; i++ )
{
if(c[i]>a[i])
{
tag = true;
break;
}
else if (c[i]<a[i])
{
tag = false;
break;
}
}
}
else if (len < lenc)
{
tag = true;
}
//计算结果
if (tag)
{
for(i=0; i<lenc; i++)
{
c[i] = c[i] - a[i] + '0';
}
}
else
{
for(i=0; i<lenc; i++)
{
c[i] = a[i] - c[i] + '0';
}
}
//处理进退位
for(i=lenc-1; i>0; i--)
{
if (c[i]>'9')
{
c[i] -= 10;
c[i-1] += 1;
}
else if (c[i]<'0')
{
c[i] += 10;
c[i-1] -= 1;
}
}
if (c[0]>'9')
{
for( j=lenc; j>1; j-- )
{
c[j] = c[j-1];
}
c[lenc+1] = '\0';
c[1] = c[0] - 10;
c[0] = '1';
}
//去除为零的高位
while (c[0]=='0')
{
lenc = strlen(c);
for(i=1;i<lenc;i++)
{
c[i-1]=c[i];
}
c[lenc-1]='\0';
}
//输出结果
if (!tag)
{
printf("The answer is:\n");
printf("-");
}
for(i=0;i<lenc;i++)
{
printf("%c",c[i]);
}
printf("\n");
return 1;
}