- NOJ 71# 大数加法
我死了。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void add(char* a,char* b,char* r);
void subtract (char* a,char* b,char* r);
int main()
{
int i;
char a[101]="",b[101]="",r[101]="",f1[100]="",f2[100]="";
gets(a);
gets(b);
if (a[0] != '-' && b[0] != '-') {
if (strlen(a) <= strlen(b)) {
add(a,b,r);
} else {
add(b,a,r);
}
}
if (a[0] == '-') {
for (i=1; i<strlen(a); i++) {
f1[i-1]=a[i];
}
}
if (b[0] == '-') {
for (i=1; i<strlen(b); i++) {
f2[i-1]=b[i];
}
}
if (a[0] == '-' && b[0] == '-') {
if (strlen(f1) <= strlen(f2)) {
add(f1,f2,r);
} else {
add(f2,f1,r);
}
printf("-");
}
if (a[0] == '-' && b[0] != '-') {
if (strlen(f1) <= strlen(b)) {
subtract(f1,b,r);
} else {
subtract(b,f1,r);
printf("-");
}
if (strlen(f1) == strlen(b)) {
for (i=0; i<strlen(f1); i++) {
if (f1[i] > b[i]) {
printf("-");
break;
}
}
}
}
if (a[0] != '-' && b[0] == '-') {
if (strlen(f2) <= strlen(a)) {
subtract(f2,a,r);
} else {
subtract(a,f2,r);
}
if (strlen(f2) == strlen(a)) {
for (i=0; i<strlen(f2); i++) {
if (f2[i] > a[i]) {
printf("-");
break;
}
}
}
}
for (i=100; i>=0; i--) {
if (r[i]=='\0' && r[i-1]=='0') r[i-1]='\0';
}
for (i=100; i>=0; i--) {
if (r[i] != '\0') printf("%c",r[i]);
}
return 0;
}
void add(char* a,char* b,char* r)
{
int i,L1,L2,delta;
i=0;
//printf("%d\n\n",atoi(a[0]));
while (a[i] != '\0') {
a[i]-=48;
i++;
}
L1=i;
i=0;
while (b[i] != '\0') {
b[i]-=48;
i++;
}
L2=i;
delta=abs(L1-L2);
int p=0;
for (i=L1; i>0; i--) {
//sprintf(r[p],"%d",a[i]+b[i+delta])%10);
r[p]=(a[i-1]+b[i+delta-1]);
//r[p+1]+=(int)((a[i]+b[i+delta])/10);
//printf("%c\n",r[p]+48);
p++;
}
for (i=delta; i>0; i--) {
r[p]=b[i-1];
//r[p+1]+=(int)((r[i]+b[i-1])/10);
//printf("%c\n",r[p]+48);
p++;
}
for (i=0; i<L2+1; i++) {
if (r[i]>9) {
r[i]%=10;
r[i+1]++;
}
}
/*if (r[strlen(b)+1] != '\0') {
r[strlen(b)+1]+=48;
}*/
for (i=0; i<L2; i++) {
r[i]+=48;
}
}
void subtract (char* a,char* b,char* r)
{
int i,L1,L2,delta;
i=0;
//printf("%d\n\n",atoi(a[0]));
while (a[i] != '\0') {
a[i]-=48;
i++;
}
L1=i;
i=0;
while (b[i] != '\0') {
b[i]-=48;
i++;
}
L2=i;
delta=abs(L1-L2);
int p=0;
for (i=L1; i>0; i--) {
r[p]=b[i+delta-1]-a[i-1];
p++;
}
for (i=delta; i>0; i--) {
r[p]=b[i-1];
p++;
}
for (i=0; i<L2; i++) {
if (r[i]<0) {
r[i]+=10;
r[i+1]--;
}
}
for (i=0; i<L2; i++) {
r[i]+=48;
}
}
以上是亲测不通过的代码 /托腮
奋战七个小时,样例都过不了的(好吧样例终于过了) /大哭
结果莫名其妙就AC了?!假的NOJ吧 /笑哭
- NOJ 75# 大数乘法
经历了大数加法的磨砺,这次似乎顺利了不少? /笑哭
感觉这次的程序没有Bug呢 /我最美
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L1 strlen(a)
#define L2 strlen(b)
void multiplication(char* a,char* b,char* r);
int main()
{
int i;
char a[101]="",b[101]="",r[1000]="",f1[100]="",f2[100]="";
gets(a);
gets(b);
if (a[0] != '-' && b[0] != '-') {
if (strlen(a) <= strlen(b)) {
multiplication(a,b,r);
} else {
multiplication(b,a,r);
}
}
if (a[0] == '-') {
for (i=1; i<strlen(a); i++) {
f1[i-1]=a[i];
}
}
if (b[0] == '-') {
for (i=1; i<strlen(b); i++) {
f2[i-1]=b[i];
}
}
if (a[0] == '-' && b[0] == '-') {
if (strlen(f1) <= strlen(f2)) {
multiplication(f1,f2,r);
} else {
multiplication(f2,f1,r);
}
printf("-");
}
if (a[0] == '-' && b[0] != '-') {
if (strlen(f1) <= strlen(b)) {
multiplication(f1,b,r);
} else {
multiplication(b,f1,r);
}
printf("-");
}
if (a[0] != '-' && b[0] == '-') {
if (strlen(f2) <= strlen(a)) {
multiplication(f2,a,r);
} else {
multiplication(a,f2,r);
}
printf("-");
}
for (i=100; i>=0; i--) {
if (r[i]=='\0' && r[i-1]=='0') r[i-1]='\0';
}
for (i=100; i>=0; i--) {
if (r[i] != '\0') printf("%c",r[i]);
}
return 0;
}
void multiplication(char* a,char* b,char* r)
{
int i,j,delta;
int tr[1000]={0};
i=0;
while (a[i] != '\0') {
a[i]-=48;
i++;
}
i=0;
while (b[i] != '\0') {
b[i]-=48;
i++;
}
int p=0;
for (i=L1-1; i>=0; i--) {
for (j=L2-1; j>=0; j--) {
tr[p]+=(a[i]*b[j]);
p++;
}
p=L1-i;
}
for (i=0; i<1000; i++) {
if (tr[i]>9) {
int temp=tr[i];
tr[i]%=10;
tr[i+1]+=temp/10;
}
}
for (i=999; i>=0; i--) {
if (tr[i] != 0) {
break;
}
}
for (; i>=0; i--) {
r[i]=tr[i]+48;
}
}
- NOJ 76# 大数减法
啊哈哈哈哈,做这题的时候终于把心心念念的大数加法的Bug修复啦~
借助了一个int数组来做计算呢,然后在判断把哪些int t(emp)r(esult)还给char r(esult)的时候就好控制啦~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void add(char* a,char* b,char* r);
void subtract(char* a,char* b,char* r);
int main()
{
int i;
char a[101]="",b[101]="",r[101]="",f1[100]="",f2[100]="";
gets(a);
gets(b);
if (a[0] != '-' && b[0] != '-') {
if (strlen(a) < strlen(b)) {
subtract(a,b,r);
printf("-");
} else {
subtract(b,a,r);
}
if (strlen(a) == strlen(b)) {
for (i=0; i<strlen(a); i++) {
if (a[i] < b[i]) {
printf("-");
break;
}
}
}
}
if (a[0] == '-') {
for (i=1; i<strlen(a); i++) {
f1[i-1]=a[i];
}
}
if (b[0] == '-') {
for (i=1; i<strlen(b); i++) {
f2[i-1]=b[i];
}
}
if (a[0] == '-' && b[0] == '-') {
if (strlen(f1) < strlen(f2)) {
subtract(f1,f2,r);
printf("-");
} else {
subtract(f2,f1,r);
}
if (strlen(f1) == strlen(f2)) {
for (i=0; i<strlen(f1); i++) {
if (f1[i] > f2[i]) {
printf("-");
break;
}
}
}
}
if (a[0] == '-' && b[0] != '-') {
if (strlen(f1) <= strlen(b)) {
add(f1,b,r);
} else {
add(b,f1,r);
}
printf("-");
}
if (a[0] != '-' && b[0] == '-') {
if (strlen(f2) <= strlen(a)) {
add(f2,a,r);
} else {
add(a,f2,r);
}
}
for (i=100; i>=0; i--) {
if (r[i]=='\0' && r[i-1]=='0') r[i-1]='\0';
}
for (i=100; i>=0; i--) {
if (r[i] != '\0') printf("%c",r[i]);
}
return 0;
}
void add(char* a,char* b,char* r)
{
int i,L1,L2,delta;
int tr[101]={0};
i=0;
while (a[i] != '\0') {
a[i]-=48;
i++;
}
L1=i;
i=0;
while (b[i] != '\0') {
b[i]-=48;
i++;
}
L2=i;
delta=abs(L1-L2);
int p=0;
for (i=L1; i>0; i--) {
tr[p]=(a[i-1]+b[i+delta-1]);
p++;
}
for (i=delta; i>0; i--) {
tr[p]=b[i-1];
p++;
}
for (i=0; i<L2+1; i++) {
if (tr[i]>9) {
tr[i]%=10;
tr[i+1]++;
}
}
for (i=100; i>=0; i--) {
if (tr[i] != 0) {
break;
}
}
for (; i>=0; i--) {
r[i]=tr[i]+48;
}
}
void subtract(char* a,char* b,char* r)
{
int i,L1,L2,delta;
int tr[101]={0};
i=0;
while (a[i] != '\0') {
a[i]-=48;
i++;
}
L1=i;
i=0;
while (b[i] != '\0') {
b[i]-=48;
i++;
}
L2=i;
delta=abs(L1-L2);
int p=0;
for (i=L1; i>0; i--) {
tr[p]=b[i+delta-1]-a[i-1];
p++;
}
for (i=delta; i>0; i--) {
tr[p]=b[i-1];
p++;
}
for (i=0; i<L2; i++) {
if (tr[i]<0) {
tr[i]+=10;
tr[i+1]--;
}
}
for (i=100; i>=0; i--) {
if (tr[i] != 0) {
break;
}
}
for (; i>=0; i--) {
r[i]=tr[i]+48;
}
}
- NOJ 77# 行程编码压缩算法
一脸懵逼啊
这俩莫名其妙的1是个啥 /沉思
答案跟样例的输出根本不一样……好吧,另外找了个答案来:
#include <stdio.h>
#include <string.h>
int main()
{
char str[1024] = {'\0'};
char result[1024] = {'\0'};
int number[1024] = {0};
scanf("%s", str);
int i;
char c = '\0';
int flag =0;
int nums = 1;
int j=0, k=0;
for (i=0; i<strlen(str); i++)
{
if (str[i] == str[i+1]) //前后两者相同
{
if (nums==9) //当前达到9
{
result[j++] = str[i];
number[k++] = nums;
nums = 0;
}
nums ++;
}
else
{
result[j++] = str[i];
number[k++] = nums;
nums = 1;
}
}
for (i=0; i<j; i++)
{
if (number[i]!=1)
{
if (flag==1)
{
printf("1");
flag = 0;
}
printf("%d%c", number[i], result[i]);
}
else
{
if (flag == 0)
{
printf("1");
flag = 1;
}
if (result[i]=='1')
{
printf("11");
}
else
{
printf("%c", result[i]);
}
}
}
return 0;
}
看晕了,还是不理解 ε=(´ο`*)))
~
~
~