UVa 424 整数查询 poj 1503

来源:互联网 发布:网络出版物 编辑:程序博客网 时间:2024/05/16 10:52

思路:就是按照白书上的定义结构体bign及相关操作。本来打算精简的,后来发现这个已经挺精简的了。

注意(自己需要注意的):string.h和string头文件是不一样的。sprintf.h在stdio.h里而不是string.h里。(交代码时出现的红色波浪线好像是浏览器的原因,不影响交题。。)还有,while(cin>>x)是间接地检查了流的状态。。

吐槽的地方,这个题最后要输出换行,题目没说

Code:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string> #define MAXN 200//string.h与string不同,包含memset、strlen等函数,stdio.h包含sprintf using namespace std;struct bign{ int len,s[MAXN]; bign(){ memset(s,0,sizeof(s)); len=1;}     bign operator=(const char* num) {  len=strlen(num);  for(int i=0;i<len;++i) s[i]=num[len-1-i]-'0';//注意把字符数字转化为数字数字的方法,减去字符0,   return *this;     }     bign operator=(int num) {  char s[MAXN];  sprintf(s,"%d",num);  *this=s;  return *this;     }  bign(int num){ *this=num;} bign(const char* num){ *this=num;}  string str() const {//用于输出   string res="";  for(int i=0;i<len;++i) res=(char)(s[i]+'0')+res;//输出时最高位在前,注意加数的顺序   if(res=="") res="\0";  return res;       }  bign operator+(const bign &b) const {  bign c;  c.len=0;  for(int i=0,g=0;i<max(len,b.len)||g;++i)  {   int x=g;   if(i<len) x=x+s[i];   if(i<b.len) x=x+b.s[i];   c.s[c.len++]=x%10;   g=x/10;         }//for  return c;     }};//structistream& operator>>(istream &in, bign &x){ string s; in>>s; x=s.c_str(); return in;        }ostream& operator<<(ostream &out, bign &x){ cout<<x.str(); return out;        }bign num;bign sum;int main(){ while(cin>>num&&num.str()!="0")//间接地检查流的状态;  当为0时结束输入    {  sum=sum+num;                                      } cout<<sum<<endl; //system("pause"); return 0;}


0 0