POJ原址:POJ1503
疯掉了,谁知道我在提交n次都失败之后终于Accepted的时候心中的坑爹之感有多么强烈……
(画外音:编辑页面刷了n遍才全部打开,CSDN你闹哪样)
参考链接:
POJ 1503 Integer Inquiry - 路漫漫其修远兮,吾将上下而求索
其实这个链接并没有参考它的程序,但是若不是它的解释启发了我,估计就只有在Wrang Answer和Runtime Error中不断死掉了,太感谢。
POJ1503-Integer Inquiry - ζёСяêτ - 小優YoU
主要参考链接,虽然复制到DEV-C中根本编译都不通过,但是还是参考了不少。
留了一堆错误版本,回过头来看没必要都发上来了,呵呵…呵呵…
这个程序历时五天,当然期间去恩施玩儿了一趟,可是纯投入也在两天左右,还是非常艰辛的呀。
值得一提的points:
1.开始试图把算本位和算进位都用函数,后来发现简直多此一举
2.Addend[length]={'\0'};这种用法从此抛弃。改为memset(Addend,'0',sizeof(Addend));初始化
3.电脑当机一次,所有注释都丢了 ,告诉了我,临时txt也是需要时时保存的。
4.还想着把一个max位单独来算,现在想想,错得真远……
这时候有提交一次,WA,用如图数据测算发现了问题:
5.“修改后囊括最高位,按正常步骤来算,不再区分 ”,但是殊不知离真相还远着呢,提交后Runtime Error,事实上都不是王道呀。
6.终极BOSS:长度103的数组。
程序:
#include<iostream>
#include<cstring>
using namespace std;
void Invert(char a[])
{
int i,j,length,k;
char b[103];
memset(b,'0',sizeof(b));
length=strlen(a);
for(k=0,j=length-1;j>=0;j--,k++)
b[k]=a[j];
strcpy(a,b);
}//反序数组结果是原数组反序并且后面全部加上字符'0'
int main()
{
int length,n,i,max=0;
char Addend[103],carry_bit[103],standard_bit[103];
memset(Addend,'0',sizeof(Addend));
memset(standard_bit,'0',sizeof(standard_bit));
memset(carry_bit,'0',sizeof(carry_bit));
cin>>Addend;
length=strlen(Addend);
Invert(Addend);
while(Addend[0]!='0'||length!=1)//在第一个数为0且数组长度为1时跳出循环,当然了,大神是这么做的while(strcmp(digit,"0"))
{
n=(int)(standard_bit[0]+Addend[0]-'0'-'0');
standard_bit[0]=n%10+'0';
carry_bit[0]=n/10+'0';
if(max<length)//为了让长度小于最长的,成为最长的长度来算
max=length;
for(i=1;i<103;i++)
{
n=(int)(standard_bit[i]+Addend[i]+carry_bit[i-1]-'0'-'0'-'0'); //n是本位的simple_add
standard_bit[i]=n%10+'0';//本位
carry_bit[i]=n/10+'0';//第i位的进位
}
cin>>Addend;
length=strlen(Addend);
Invert(Addend);
}
for(i=max;i<103;i++)
if(standard_bit[i]=='0')
{
max=i;//刷新max,代表结果的最高位
standard_bit[max]='\0';
break;
}
Invert(standard_bit);
standard_bit[max]='\0';
cout<<standard_bit<<endl;
return 0;
}