算法一(string)
我们可以把它看成一个字符,让后一个一个累加就可以了,但要一定强制转换s[i]-'0'
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++){
cnt+=s[i]-'0';
}
cout<<cnt;
return 0;
}
算法二(正常)
可能会比上一个慢一点一点
就是自然数的拆分
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int main()
{
int n;
cin>>n;
int r;
while(n!=0){
r=n%10;
n/=10;
cnt+=r;
}
cout<<cnt;
return 0;
}
算法三(char)
不就是string
#include<bits/stdc++.h>
using namespace std;
char t;
int res;
int main()
{
while((cin >> t)) res += t - '0';
cout << res;
}
声明:以上太简单(开始搞恶)
NB算法一(进制转换)
#include <bits/stdc++.h>
using namespace std;
int A[30], B[30], a, b;
int check(int mod) {
int x = a, y = b, ta = 0, tb = 0;
while (x) {
A[++ta] = x % mod;
x /= mod;
}
while (y) {
B[++tb] = y % mod;
y /= mod;
}
for (int i = 1; i <= max(ta, tb); i++) {
A[i] += B[i];
if (A[i] >= mod) A[i + 1] += A[i] / mod, A[i] %= mod;
}
if (A[ta + 1]) ta++;
int Ans = 0;
for (int i = ta; i > 0; i--) Ans = Ans * mod + A[i];
return Ans;
}
int main() {
scanf("%d%d", &a, &b);
a=0,b=0;
int ans[100010];
for (int i = 1; i <= 100000; i++) {
srand((unsigned)time(NULL));
int o = (int) rand() % 1000000 + 2; //取随机进制
ans[i] = check(o);
}
bool f = 1;
for (int i = 2; i <= 100000; i++) if (ans[i] != ans[i - 1]) { f = 0; break; }
char t;
int res=0;
while((cin >> t)) res += t - '0';
cout << res;
return 0;
}
进制转换应该参考了次吧:https://www.acwing.com/solution/content/69403/
这里面的进制转换
NB
NNNNB