北京驰普工程师选拔试题-最简单的一题

来源:互联网 发布:vb金字塔程序化 编辑:程序博客网 时间:2024/05/17 03:47

/*
计算表达式的值:
-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;
}