1799: Problem C: Primary Arithmetic
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 171 Solved: 55
[Submit][Status][Web Board]Description
Problem C: Primary Arithmetic
Children are taught to add multi-digit numbers from right-to-left one digit at a time. Many find the "carry" operation - in which a 1 is carried from one digit position to be added to the next - to be a significant challenge. Your job is to count the number of carry operations for each of a set of addition problems so that educators may assess their difficulty.
Each line of input contains two unsigned integers less than 10 digits. The last line of input contains 0 0. For each line of input except the last you should compute and print the number of carry operations that would result from adding the two numbers, in the format shown below.
Input
Output
Sample Input
123 456 555 555 123 594 0 0
Sample Output
No carry operation. 3 carry operations. 1 carry operation.
#include<bits/stdc++.h>
#define ll long long
#define ve vector
#define mp map
#define NO cout<<"NO"<<endl;
#define YES cout<<"YES"<<endl;
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define st string
#define N 10005
#define eps 1e-13
using namespace std;
const double pi =acos(-1.0);
const int maxn=1e6+5;
const ll mod =1e15;
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
//set<ll> s;
ve<ll> v;
priority_queue<ll, ve<ll>, greater<ll> >q;
int lcm(int a,int b){
return a*b/__gcd(a,b);
}
bool isleaf(int x){
return x%400==0||(x%4==0&&x%100==0);
}
int primes[N], cnt;
bool vis[N];
void is_prime(int x){
vis[1] = vis[0] = 1;
for(int i = 2; i <= x; ++ i){
if(!vis[i])primes[cnt ++ ] = i;
for(int j = 0; primes[j] * i <= x; ++ j){
vis[primes[j] * i] = true;
if(i % primes[j] == 0)break;
}
}
}//1e6;
ll qpow(ll a,ll n)//快速幂 ll mod=1e15;
{
ll re=1;
while(n)
{
if(n&1)
re=(re*a)%mod;
n>>=1;
a=(a*a)%mod;
}
return re;
}
inline ll qmul(ll x,ll y,ll p)//快速乘
{
ll z=(long double)x/p*y;
ll res=(unsigned long long)x*y-(unsigned long long)z*p;
return (res+p)%p;
}
void pprint(char *);
struct ob
{
char MC[100];
double DJ;
int SL;
};
char a[maxn], b[maxn];
int s[maxn];
int len;
int sum(char *a, char *b)
{
int cc=0;
mem(s,0);
int la = strlen(a);
int lb = strlen(b);
reverse(a, a + la);
reverse(b, b + lb);
for (int i = 0; i < la; ++i)
a[i] = a[i] - '0';
for (int i = 0; i < lb; ++i)
b[i] = b[i] - '0';
len = max(la, lb);
int ans, tem = 0;
for (int i = 0; i <= len; ++i)
{
ans = a[i] + b[i] + tem;
s[i] = ans % 10;
tem = ans / 10;
if(tem == 1)
cc++;
}
return cc;
}
int main(){
while(scanf("%s%s", a, b) && (a[0]!='0' || b[0]!='0')){
mem(s,0);
int ans = sum(a, b);
if(ans > 1)
printf("%d carry operations.\n", ans);
else if(ans == 1)
printf("%d carry operation.\n", ans);
else
printf("No carry operation.\n");
}
return 0;
}