我的解法
#include<iostream>
#include<string>
using namespace std ;
int main(){
int a,b,c,d;
cin>>a>>b;
int n=0;
c=a+b;
if(c<0){ //先解决输出负号的问题
c=-c;
cout<<"-";
}
d=c;
if(d == 0) cout<<d; //这个是有一个检验点一直不通过,我才发现我没有考虑a+b=0的情况
while(d != 0){ //这是为了计算a+b的位数
d=d/10;
n++;
}
int s[30];
for(int i = 0; i < n; i++){ //把a+b的每一位都存到数组里,个位在数组的最前端存着
s[i] = c%10;
c=c/10;
}
for(int i = n-1; i >= 0;i--){ //逆序输出
cout<<s[i];
if(i%3 == 0 && i != 0){ //隔三位输出一个逗号
cout<<",";
}
}
return 0;
}
感觉我写的很杂很low不专业,一点也不优美,丢三落四的 。
当时写的时候特别想直接把int型转换为string型,上网搜了一个好像是什么to_string的用法,但是之前没见过,所以也没用。
学习一下优美一些的解法
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b; //输入a和b
string s = to_string(a + b); //将a+b的值转换为字符串
if(s[0] == '-') { //处理符号
cout << '-';
s.erase(0, 1);
}
int count = 0; //用于记录当前位置
for(int i = s.length() - 1; i >= 0; i--){ //添加逗号
count++;
if(count % 3 == 0 && i > 0){
s.insert(i, ",");
}
}
cout << s;
}
上面的代码用了一些库函数,我不是特别习惯这样,当然这样可以省很多事了。
学习的点
1.string s = to_string(a + b); //将a+b的值转换为字符串
2.s.erase(pos,n) //删除字符串s中从第pos位开始的n个字符
3.s.insert(pos,"w") //在第pos位中添加字符串w,w不止一位的话则顺延后面的位置
4.倒序循环,巧用count++从后向前每三位加一个逗号,然后再正序输出。
讨论的点
1.可以先判断要不要输出负号,再to_string(和的绝对值)。
2.我是倒序载入原始数据,然后再倒序输出,边输出边加逗号,这么看也挺巧妙的!
即:从数据的最后一位开始标号,标为0,由低位到高位标号依次增大(和优美解法中count的作用异曲同工),则标号为3的倍数的位之后要加逗号。
综合一下,写个我喜欢的解法
我觉得很符合常人的脑回路...
#include<iostream>
#include<string>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b;
c=a+b;
if(c < 0){
cout<<"-";
c=-c;
}
string s =to_string(c);//int->string
char w[30];int j=0;
for(int i=s.length()-1;i>=0;i--,j++){//倒序载入
w[j]=s[i];
}
for(int i=s.length()-1;i>=0;i--){ //倒序输出
cout<<w[i];
if(i%3 == 0 && i != 0){
cout<<",";
}
}
return 0;
}
写完啦写完啦!