hdoj 1230 火星A+B(模拟加法进位运算)
2017-12-29 16:00
477 查看
思路:题意还是比较好理解的,第几位就是逢第几个素数进一;如个位逢2进1,十位逢3进1,百位逢5进1,....然后模拟这样的进位操作输出结果就好了;
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
int ss[30];
void fun() //找25位素数
{
int i;
int z;
int flag;
int x;
x = 0;
for (i = 2; i < 1000; i++)
{
flag = 0;
for (z =2; z < i; z++)
{
if (i%z == 0)
{
flag = 1;
break;
}
}
if (!flag)
ss[x++] = i;
if (x == 30)
break;
}
}
int change(char a[100], int y[100]) //将输入的字符串数,转化成整形数组
{
int len;
int i;
int head;
int tail;
int z;
int p;
int x;
len = strlen(a);
head = tail = 0;
x = 0;
for (i = 0; i < len; i++)
{
if (a[i] == ',')
{
tail=i;
p = 1;
for (z = tail-1; z>=head; z--)
{
y[x] += (a[z] - '0')*p;
p *= 10;
}
x++;
head = tail + 1;
}
if (i == len - 1)
{
y[x] += a[i] - '0';
}
}
return x;
}
int main()
{
int a[100];
int b[100];
int sum[100];
int len1, len2;
int wei;
int x;
int i;
char z[100],y[100];
fun();
while (scanf("%s %s", z, y) && (strcmp(z, "0") || strcmp(y, "0")))
{
wei = 0;
x = 0;
memset(sum, 0, sizeof(sum)); //一开始要进行初始化
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
len1=change(z,a)+1; //记录整型数组的长度
len2=change(y,b)+1;
while (len1>0 || len2>0) //从个位开始对每一位进行计算,并把整除的结果给高位,原位留下余数
{
if (len1 > 0 && len2 > 0)
{
sum[x + 1] += (sum[x] + a[len1 - 1] + b[len2 - 1] ) / ss[wei];
sum[x] = (sum[x]+a[len1 - 1] + b[len2 - 1] ) % ss[wei];
x++;
}
else if (len1 <= 0 && len2 > 0)
{
sum[x + 1] += (sum[x] + b[len2 - 1] ) / ss[wei];
sum[x] = (sum[x]+ b[len2 - 1] ) % ss[wei];
x++;
}
else if (len1 > 0 && len2 <= 0)
{
sum[x + 1] += (sum[x] + a[len1 - 1] ) / ss[wei];
sum[x] = (sum[x]+a[len1 - 1] ) % ss[wei];
x++;
}
wei++;
len1 --;
len2 --;
}
if (sum[x] == 0) //因为一开始是从低位到高位存入的,所以要反序输出,并且看最高位是否有值
{
for (i = x - 1; i >= 0; i--)
{
printf("%d", sum[i]);
if (i != 0)
printf(",");
else
printf("\n");
}
}
else
{
for (i = x; i >= 0; i--)
{
printf("%d", sum[i]);
if (i != 0)
printf(",");
else
printf("\n");
}
}
}
system("puase");
return 0;
}
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
int ss[30];
void fun() //找25位素数
{
int i;
int z;
int flag;
int x;
x = 0;
for (i = 2; i < 1000; i++)
{
flag = 0;
for (z =2; z < i; z++)
{
if (i%z == 0)
{
flag = 1;
break;
}
}
if (!flag)
ss[x++] = i;
if (x == 30)
break;
}
}
int change(char a[100], int y[100]) //将输入的字符串数,转化成整形数组
{
int len;
int i;
int head;
int tail;
int z;
int p;
int x;
len = strlen(a);
head = tail = 0;
x = 0;
for (i = 0; i < len; i++)
{
if (a[i] == ',')
{
tail=i;
p = 1;
for (z = tail-1; z>=head; z--)
{
y[x] += (a[z] - '0')*p;
p *= 10;
}
x++;
head = tail + 1;
}
if (i == len - 1)
{
y[x] += a[i] - '0';
}
}
return x;
}
int main()
{
int a[100];
int b[100];
int sum[100];
int len1, len2;
int wei;
int x;
int i;
char z[100],y[100];
fun();
while (scanf("%s %s", z, y) && (strcmp(z, "0") || strcmp(y, "0")))
{
wei = 0;
x = 0;
memset(sum, 0, sizeof(sum)); //一开始要进行初始化
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
len1=change(z,a)+1; //记录整型数组的长度
len2=change(y,b)+1;
while (len1>0 || len2>0) //从个位开始对每一位进行计算,并把整除的结果给高位,原位留下余数
{
if (len1 > 0 && len2 > 0)
{
sum[x + 1] += (sum[x] + a[len1 - 1] + b[len2 - 1] ) / ss[wei];
sum[x] = (sum[x]+a[len1 - 1] + b[len2 - 1] ) % ss[wei];
x++;
}
else if (len1 <= 0 && len2 > 0)
{
sum[x + 1] += (sum[x] + b[len2 - 1] ) / ss[wei];
sum[x] = (sum[x]+ b[len2 - 1] ) % ss[wei];
x++;
}
else if (len1 > 0 && len2 <= 0)
{
sum[x + 1] += (sum[x] + a[len1 - 1] ) / ss[wei];
sum[x] = (sum[x]+a[len1 - 1] ) % ss[wei];
x++;
}
wei++;
len1 --;
len2 --;
}
if (sum[x] == 0) //因为一开始是从低位到高位存入的,所以要反序输出,并且看最高位是否有值
{
for (i = x - 1; i >= 0; i--)
{
printf("%d", sum[i]);
if (i != 0)
printf(",");
else
printf("\n");
}
}
else
{
for (i = x; i >= 0; i--)
{
printf("%d", sum[i]);
if (i != 0)
printf(",");
else
printf("\n");
}
}
}
system("puase");
return 0;
}
相关文章推荐
- hdoj 1230 火星A+B 【模拟】
- 一元多项式的乘法与加法运算 (模拟)
- 模拟+位运算 HDOJ 5491 The Next
- 【hdoj1002】 A + B Problem II(模拟加法)
- HDU 1230 HDOJ 1230 火星A+B ACM 1230 IN HDU
- 【HDOJ】1230 火星A+B
- HDOJ 1230 火星A+B
- HDU_1230——火星A+B,加法进制问题
- 11.用链表模拟大整数加法运算
- [HDOJ1002] A + B Problem II 高数度加法运算
- PAT 一元多项式的乘法与加法运算(20)(模拟计算过程)
- hdoj 1230 火星A+B
- HDU1230 火星A+B 加法模拟题
- 用C实现模拟图灵机进行两个数的加法运算
- hdoj 1230 火星A+B
- ACM1230_火星A+B(进位的运算)
- 用链表模拟大整数加法运算
- 利用位图方法求字符串的组合(类似于位运算模拟加法)
- Axure RP Pro - 相关问题 - 模拟加法运算
- HDOJ1230 火星A+B