口算练习题
2024年12月25日大约 2 分钟
1. 无脑 if
#include <bits/stdc++.h>
using namespace std;
int cal(int x)
{
bool flag = false;
if (x < 0)
{
flag = true;
x = -x;
}
if (0 <= x && x <= 9)
return 1 + flag;
else if (10 <= x && x <= 99)
return 2 + flag;
else if (100 <= x && x <= 999)
return 3 + flag;
else if (1000 <= x && x <= 9999)
return 4 + flag;
else if (10000 <= x && x <= 99999)
return 5 + flag;
else if (100000 <= x && x <= 999999)
return 6 + flag;
else if (1000000 <= x && x <= 9999999)
return 7 + flag;
else if (10000000 <= x && x <= 99999999)
return 8 + flag;
else if (100000000 <= x && x <= 999999999)
return 9 + flag;
}
void f(char op, int a, int b)
{
int c;
if (op == 'a')
{
c = a + b;
op = '+';
}
else if (op == 'b')
{
c = a - b;
op = '-';
}
else if (op == 'c')
{
c = a * b;
op = '*';
}
cout << a << op << b << "=" << c << "\n";
cout << cal(a) + cal(b) + cal(c) + 2 << "\n";
}
int main()
{
int n;
cin >> n;
char op; // 运算符
int a, b; // 两个运算数
string temp; // 临时字符串
for (int i = 1; i <= n; i++)
{
cin >> temp;
if ('0' <= temp[0] && temp[0] <= '9')
{
a = 0;
for (int j = 0; j < temp.size(); j++)
a = a * 10 + (temp[j] - '0');
cin >> b;
}
else
{
op = temp[0];
cin >> a;
cin >> b;
}
f(op, a, b);
}
return 0;
}
2. 循环代替多层 if
#include <bits/stdc++.h>
using namespace std;
int cal(int x)
{
bool flag = false;
if (x < 0)
{
flag = true;
x = -x;
}
for (int i = 10, j = 1;; i *= 10, j++)
if (x < i)
return j + flag;
}
void f(char op, int a, int b)
{
int c;
if (op == 'a')
{
c = a + b;
op = '+';
}
else if (op == 'b')
{
c = a - b;
op = '-';
}
else if (op == 'c')
{
c = a * b;
op = '*';
}
cout << a << op << b << "=" << c << "\n";
cout << cal(a) + cal(b) + cal(c) + 2 << "\n";
}
int main()
{
int n;
cin >> n;
char op; // 运算符
int a, b; // 两个运算数
string temp; // 临时字符串
for (int i = 1; i <= n; i++)
{
cin >> temp;
if ('0' <= temp[0] && temp[0] <= '9')
{
a = 0;
for (int j = 0; j < temp.size(); j++)
a = a * 10 + (temp[j] - '0');
cin >> b;
}
else
{
op = temp[0];
cin >> a;
cin >> b;
}
f(op, a, b);
}
return 0;
}
3. 数位分解计算位数(注意特判 0)
#include <bits/stdc++.h>
using namespace std;
int cal(int x)
{
if (x == 0)
return 1;
int res = 0;
if (x < 0)
{
res = 1;
x = -x;
}
while (x > 0)
{
res++;
x /= 10;
}
return res;
}
void f(char op, int a, int b)
{
int c;
if (op == 'a')
{
c = a + b;
op = '+';
}
else if (op == 'b')
{
c = a - b;
op = '-';
}
else if (op == 'c')
{
c = a * b;
op = '*';
}
cout << a << op << b << "=" << c << "\n";
cout << cal(a) + cal(b) + cal(c) + 2 << "\n";
}
int main()
{
int n;
cin >> n;
char op; // 运算符
int a, b; // 两个运算数
string temp; // 临时字符串
for (int i = 1; i <= n; i++)
{
cin >> temp;
if ('0' <= temp[0] && temp[0] <= '9')
{
a = 0;
for (int j = 0; j < temp.size(); j++)
a = a * 10 + (temp[j] - '0');
cin >> b;
}
else
{
op = temp[0];
cin >> a;
cin >> b;
}
f(op, a, b);
}
return 0;
}
4. 利用字符串流
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
void f(char c, int a, int b)
{
stringstream ss;
if (c == 'a')
ss << a << "+" << b << "=" << a + b << "\n";
if (c == 'b')
ss << a << "-" << b << "=" << a - b << "\n";
if (c == 'c')
ss << a << "*" << b << "=" << a * b << "\n";
string s;
getline(ss, s);
cout << s << "\n";
cout << s.length() << "\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
getline(cin, s);
char c;
int a, b;
while (n--)
{
getline(cin, s);
stringstream ss;
ss << s;
if ('0' <= s[0] && s[0] <= '9')
{
ss >> a >> b;
f(c, a, b);
}
else
{
ss >> c >> a >> b;
f(c, a, b);
}
}
return 0;
}