火星A+B
做的有点混乱,效率也不是太高,如分割数字时,就不如挨个扫描来的快,怎么就没想到呢?笨呢!还有可以先求出前25个素数,这样代码效率会高些长度也会小些。
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <algorithm>
// 浙大2006 杭电1230
using namespace std;
#define MAX 25
int prime[MAX];
bool isPrime(int n)
{
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
void rev(int a[], int len)
{
for (int i = 0, j = len-1; i < j; i++,j--)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int getData(char *s,int a[])
{
char *seps = ",";
char *token;
int i = 0;
token = strtok(s, seps);
while (token != NULL)
{
a[i++] = atoi(token);
token = strtok(NULL, seps);
}
rev(a, i);
return i;
}
// add a and b
int add(int a[], int b[], int ans[], int len_a, int len_b)
{
int i;
for (i = 0; i < len_a && i < len_b; i++)
{
ans[i] += a[i] + b[i];
if (ans[i] >= prime[i])
{
ans[i+1] += ans[i] / prime[i];
ans[i] %= prime[i];
}
}
if (len_a != len_b)
{
for(; i < len_a; i++)
{
ans[i] += a[i];
if (ans[i] >= prime[i])
{
ans[i+1] += ans[i] / prime[i];
ans[i] %= prime[i];
}
}
for(; i < len_b; i++)
{
ans[i] += b[i];
if (ans[i] >= prime[i])
{
ans[i+1] += ans[i] / prime[i];
ans[i] %= prime[i];
}
}
} // end of if(len_a != len_b)
// return the length of the answer
if (ans[i] != 0)
return i+1;
else
return i;
}
int
main(void)
{
int a[MAX];
int b[MAX];
int ans[26];
int len_a;
int len_b;
char s[500];
// fstream cin("hello.txt");
for (int i = 0, j = 2; i < 25; j++)
{
if (isPrime(j))
prime[i++] = j;
}
while(true)
{
len_a = 0;
len_b = 0;
// 获取a
cin >> s;
len_a = getData(s, a);
// 获取b
cin >> s;
len_b = getData(s, b);
if (len_a == 1 && len_b == 1 && a[0] == 0 && b[0] == 0)
break;
memset(ans, 0, sizeof(int)*26);
// 计算并输出计算结果
int len_ans = add(a, b, ans, len_a, len_b);
for (int i = len_ans-1; i >=0; i--)
{
cout << ans[i];
if (i == 0)
cout << endl;
else
cout << ",";
}
}
return 0;
}

浙公网安备 33010602011771号